T-SQL采用不同的JOIN方法,结果相同,您更喜欢哪一种?

时间:2014-01-21 12:39:24

标签: tsql left-join inner-join database-performance

这些是如何进行连接的3种方法。我想听听有关这3个查询的执行情况的一些消息。 谢谢

SELECT * FROM 
tableA A LEFT JOIN tableB B
    INNER JOIN tableC C
    ON C.ColumnC = B.ColumnB

ON B.ColumnB = A.ColumnB
WHERE ColumnX = 'XY'

对战

SELECT * FROM 
tableA A LEFT JOIN tableB B 
    ON B.ColumnB = A.ColumnB
INNER JOIN tableC C
    ON C.ColumnC = B.ColumnB
WHERE ColumnX = 'XY'

与公共表格表达

WITH T...

2 个答案:

答案 0 :(得分:0)

没关系。

SQL Server有一个基于成本的优化器(而不是基于规则的优化器)。这意味着引擎能够确定前两个选项都是相同的。运行您的估计和实际执行计划,您将看到情况就是这样。

您选择一个选项而不是另一个选项的唯一原因是为了便于阅读。我选择了第二个选项,因为当涉及到很多连接时,它更容易阅读。反向的ON条款变得很难跟踪。

答案 1 :(得分:-1)

根据我的经验,根据您的表格,上述任何一项都可能更快。

当您设置联接时,您希望尽可能以最严格的限制开始(显然不会对最终结果产生负面影响)。出于同样的原因,同样的逻辑也适用于Where子句。通过从最严格的限制开始,您将限制正在连接的行数,从而通过Where子句进行评估,然后在select子句中返回/操作。对于我在下面关于三个特定场景的答案,我假设一个足够复杂的查询,不仅仅是想要组合来自多个表的数据(即,回答特定问题的查询)。

如果表A很大,表B& C较小且与您试图隔离的数据更直接相关,那么第一个选项可能会最快。

如果表B或C很大且表A与您想要的数据更相关,则第二个选项可能是最快的。

就选项3而言,我喜欢CTE,但我尝试只在我需要时才使用它们。如果CTE加入,操作和返回的数据仅以有限的方式与查询的其余部分相关,则使用CTE将加速整体查询。包含仅与您的主要联接字符串中的最终结果部分相关的表格将不必要地减慢您的查询速度。如果您可以将数据解析为CTE,它可以自行运行,然后在最后合并回主查询。