【问题标题】:Is an "on" criteria quicker than a "where"? [duplicate]“on”标准比“where”更快吗? [复制]
【发布时间】:2016-12-12 19:12:49
【问题描述】:

假设我们在t1t2 之间有一个连接,如下所示:

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


【解决方案1】:

没有区别。查看实际的执行计划。你会看到他们是平等的。

在 SQL Server Management Studio 中:查询 -> 包括实际执行计划

【讨论】:

  • 你能检查一下我们正在讨论的所有可能的查询的执行计划吗?
  • @LajosArpad 是的,我可以;)您可以在文档中阅读有关 SQL 优化器的信息。它正在分解 sql 语句,并以相同的方式处理所有过滤条件。
  • 你的语句对左连接也有效吗?
  • @LajosArpad 当然可以,但是对于左连接,您通常必须小心。如果您在左连接的右侧表上设置条件,那么您可能会丢失所有由于左连接而为 NULL 的记录。
  • 请看这里:stackoverflow.com/questions/354070/… 了解我们谈论左连接时的区别
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 2013-05-17
  • 1970-01-01
  • 2015-02-02
  • 2011-10-12
  • 2018-05-11
  • 2012-07-22
  • 2013-05-29
相关资源
最近更新 更多