【发布时间】:2016-12-12 19:12:49
【问题描述】:
假设我们在t1 和t2 之间有一个连接,如下所示:
select c1, ..., cn
from t1 join t2
on t1.fk = t2.k
join t3
on t2.fk = t3.k
where (some condition independent from t3)
(some condition independent from t3) 可能是任何东西。现在,考虑这个查询:
select c1, ..., cn
from t1 join t2
on t1.fk = t2.k and (some condition independent from t3)
join t3
on t2.fk = t3.k
让我们假设t1 x t2 x t3 以及join 条件产生count1 行,而如果我们也按where 条件过滤,那么我们将有count2 记录,其中count2
我想知道where 条件是针对所有count1 行执行,还是仅针对count2 行的子集执行?尽快将条件包含在 on 条件中而不是在查询末尾附加它们在性能方面更好吗?
【问题讨论】:
-
它们应该是一样的。 SQL 优化器只查看过滤条件,而不是它们的定义位置。注意:对于外部连接,语义可能会根据条件的不同而有所不同。
标签: sql-server performance join where-clause on-clause