在内连接条件之前过滤表

Yos*_*mit 2 sql join predicate inner-join where-clause

这里有一个类似的问题,但我的疑问略有不同:

select *
from process a inner join subprocess b on a.id=b.id and a.field=true
and b.field=true
Run Code Online (Sandbox Code Playgroud)

那么,在使用 时inner join,哪个操作先出现:连接还是a.field=true条件?

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

哪种方法是最好的?

Der*_*k W 5

首先要做的事情是:

哪个操作先出现: join 或 a.field=true 条件?

INNER JOIN将此 ( a.field=true) 作为连接条件的一部分包含在内。因此它将阻止在此过程中添加行JOIN

RDBMS 的一部分是“查询优化器”,它通常会找到执行查询的最有效方法 - 无法保证条件的评估顺序INNER JOIN

最后,我建议这样重写您的查询:

SELECT *
FROM process AS a 
INNER JOIN subprocess AS b ON a.id = b.id
WHERE a.field = true AND b.field = true
Run Code Online (Sandbox Code Playgroud)

这将有效地执行与原始查询相同的操作,但 SQL 程序员普遍认为它更具可读性。优化器可以根据需要重新排列INNER JOIN和谓词。WHERE