在内连接条件之前过滤表

时间:2014-03-08 01:36:42

标签: sql join inner-join where predicate

有一个类似的问题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过滤的行。

哪种方法最好?

2 个答案:

答案 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 JOINWHERE谓词。

答案 1 :(得分:0)

您正在考虑使用过程语言而不是SQL。 SQL是一种声明性语言,引擎可以自由选择最适合给定情况的执行计划。因此,无法预测连接或首先执行的位置。

考虑SQL的更好方法是优化查询。确保您的连接和数据被索引覆盖的事情。此外,至少在MS Sql Server中,您可以预览估计的或实际的执行计划。没有什么可以阻止你这样做并亲眼看到。