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
条件

由于这两个表非常大,我的目标是首先过滤table
process
,然后只连接使用table
subprocess
过滤的行


哪一种是最好的方法?

您在考虑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
谓词,因为它认为这样做合适