有一个类似的问题here,但我的疑问略有不同:
select *
from process a inner join subprocess b on a.id=b.id and a.field=true
and b.field=true
那么,在使用inner join
时,首先是哪个操作:加入还是a.field=true
条件?
由于这两个表非常大,我的目标是首先过滤表process
,之后只加入用表subprocess
过滤的行。
哪种方法最好?
答案 0 :(得分:2)
首先要做的事情:
首先是哪个操作:连接或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
这将有效地执行与原始查询相同的操作,但SQL程序员普遍认为它更具可读性。优化程序可以根据需要重新排列INNER JOIN
和WHERE
谓词。
答案 1 :(得分:0)
您正在考虑使用过程语言而不是SQL。 SQL是一种声明性语言,引擎可以自由选择最适合给定情况的执行计划。因此,无法预测连接或首先执行的位置。
考虑SQL的更好方法是优化查询。确保您的连接和数据被索引覆盖的事情。此外,至少在MS Sql Server中,您可以预览估计的或实际的执行计划。没有什么可以阻止你这样做并亲眼看到。