Sql 内部联接条件之前的筛选表
有一个类似的问题,但我的怀疑略有不同:Sql 内部联接条件之前的筛选表,sql,join,inner-join,where,predicate,Sql,Join,Inner Join,Where,Predicate,有一个类似的问题,但我的怀疑略有不同: select * from process a inner join subprocess b on a.id=b.id and a.field=true and b.field=true 那么,当使用内部联接时,先执行哪一个操作:联接还是a.field=true条件 由于这两个表非常大,我的目标是首先过滤tableprocess,然后只连接使用tablesubprocess过滤的行 哪一种是最好的方法?您在考虑SQL时使用的是过程语言,而不是过程语言。
select *
from process a inner join subprocess b on a.id=b.id and a.field=true
and b.field=true
那么,当使用内部联接时,先执行哪一个操作:联接还是a.field=true
条件
由于这两个表非常大,我的目标是首先过滤tableprocess
,然后只连接使用tablesubprocess
过滤的行
哪一种是最好的方法?您在考虑SQL时使用的是过程语言,而不是过程语言。SQL是一种声明性语言,引擎可以自由选择最适合给定情况的执行计划。因此,无法预测是否首先执行联接或where
考虑SQL的更好方法是优化查询。比如确保索引覆盖了连接和位置。此外,至少在MS Sql Server中,您可以预览估计的或实际的执行计划。没有什么能阻止你这样做,让你自己去看。第一件事:
哪个操作首先出现:join或a.field=true条件
您的内部联接
将此(a.field=true
)作为联接条件的一部分。因此,它将防止在JOIN
过程中添加行
RDBMS的一部分是“查询优化器”,它通常会找到执行查询的最有效方法-无法保证内部联接
条件的计算顺序
最后,我建议您以这种方式重写查询:
SELECT *
FROM process AS a
INNER JOIN subprocess AS b ON a.id = b.id
WHERE a.field = true AND b.field = true
这将有效地执行与原始查询相同的操作,但SQL程序员普遍认为它更具可读性。优化器可以重新排列内部联接
和WHERE
谓词,因为它认为这样做合适