Tsql T-SQL不同的连接方法,相同的结果,您更喜欢哪一种?

Tsql T-SQL不同的连接方法,相同的结果,您更喜欢哪一种?,tsql,left-join,inner-join,database-performance,Tsql,Left Join,Inner Join,Database Performance,以下是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' 对 与常用表表达式的比较 根据我的经验,以上任何一项都可能更快,具体取决于您的桌子 在设置连接时,您希望从尽可能严格的限制开始(显然,不会

以下是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'


与常用表表达式的比较
根据我的经验,以上任何一项都可能更快,具体取决于您的桌子

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

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

如果表B或C很大,而表A与所需数据更相关,那么第二个选项可能最快

就选项3而言,我喜欢CTE,但我尽量只在需要时使用它们。如果CTE连接、操作和返回的数据仅以有限的方式与查询的其余部分相关,那么使用CTE将加快整个查询的速度。在联接的主字符串中包含仅与最终结果部分相关的表将不必要地降低查询速度。如果您可以将该数据解析为CTE,它可以自己快速运行,然后在最后合并回主查询。

这无关紧要

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


选择一个选项而不是另一个选项的唯一原因是为了可读性。我同意你的第二个选择,因为当涉及到很多连接时,阅读起来要容易得多。相反顺序的条款很难跟踪。

使用实际执行计划运行所有条款并进行调查。这很难预测。我用自己的一些表格做了一些测试。前两个代码块的结果非常接近。第一个代码块中是否缺少一些括号?tableB的连接条件在tableC的内部连接之后?@NickyvV-这是完全有效的T-SQL。它的意思是,首先执行TableB和TableC之间的内部联接。然后,生成的表被左连接到表A。就我个人而言,我将内部连接保持在顶部。在本例中,我将有一个带有左连接的CTE。下面,我会在TableC上做一个内部连接。我不想这样做,但是-1。SQL Server有一个基于成本的优化器。它绝对不会根据T-SQL中子句的顺序来决定查询计划,尽管不同的结构(例如使用EXISTS子句与联接,或外部联接与内部联接)会改变语义,从而改变执行速度。因此,指定内部联接与外部联接是否先发生不会影响性能,但是,将内部联接更改为外部联接,或者将外部联接更改为内部联接,会吗?诚实地问。通常是这样,但这取决于表之间的关系。由于连接的语义不同(也就是说,可以返回不同的行),因此性能和计划通常会不同。
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...