哪种方式更好的性能(选择嵌套表或连接)?

时间:2013-10-10 06:26:54

标签: sql sql-server sql-server-2008 join

 SELECT * FROM dbo.table1, 
 dbo.table2 AS T2,
 dbo.table3 AS T3, 
 dbo.table4 AS T4
 WHERE dbo.table1.ID = T2.ID 
 AND T2.ID = T3.ID 
 AND T3.ID = T4.ID 

(OR)

SELECT 
* 
FROM dbo.table1 T1 
INNER JOIN dbo.table2 T2 ON T1.ID = T2.ID 
INNER JOIN dbo.table3 T3 ON T2.ID = T3.ID 
INNER JOIN dbo.table4 T4 ON T3.ID = T4.ID 

4 个答案:

答案 0 :(得分:2)

两者都没有区别。最好远离“逗号连接”,因为a)ANSI连接语法更具表现力,无论如何你都要使用它来进行LEFT JOIN,混合风格是有问题的,所以你不妨只使用一种风格; b)ANSI样式更清晰。

答案 1 :(得分:0)

两者都需要相同的时间来执行,没有性能差异。

如果没有Join关键字,则其行为为Cross Joins,生成的结果包含来自两个或多个表的每个行组合。这意味着如果表table2有6行而table table3有3行,则交叉连接将产生18行。这两个表之间没有建立任何关系 - 你实际上只是产生了所有可能的组合。

使用内部联接,表中一行的列值与另一行(或同一)表的另一行中的列值组合,形成一行数据。

如果将WHERE子句添加到交叉连接中,则它将作为内连接运行,因为WHERE强加了限制因子。

答案 2 :(得分:0)

在上面提到的两种情况中,sql引擎在后台执行它们的方式没有任何区别。唯一影响性能的是在连接时加入列的索引的效率以及逗号分隔的表名称的where子句。

因此,请确保您拥有正确的索引,更新统计信息等

另一个重要的事情是你使用select“*”,如果可能的话,尝试只使用你感兴趣的列。

答案 3 :(得分:0)

两者都是连接,首先是隐式,它将执行前一个答案中指向的交叉连接,后一个是显式的内连接概念。虽然它在性能方面不应该有所作为。