左连接的最佳最佳顺序(连接)

时间:2010-06-11 18:30:24

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

我有3个表Table1(有1020690条记录),表2(有289425条记录),表3(有83692条记录)。我有类似的东西

SELECT * FROM Table1 T1 /* OK fine select * is bad when not all columns are needed, this is just an example*/
LEFT JOIN Table2 T2 ON T1.id=T2.id
LEFT JOIN Table3 T3 ON T1.id=T3.id

和像这样的查询

SELECT * FROM Table1 T1
LEFT JOIN Table3 T3 ON T1.id=T3.id
LEFT JOIN Table2 T2 ON T1.id=T2.id

查询计划向我显示它为两个联接使用了2个Merge Join。对于第一个查询,第一个合并是T1和T2,然后是T3。对于第二个查询,第一个合并是T1和T3,然后是T2。

这两个查询大约需要大约相同的时间(大约40秒),或者有时Query1需要几秒钟的时间。

所以我的问题是,加入顺序是否重要?

3 个答案:

答案 0 :(得分:3)

像这样的简单查询的连接顺序无关紧要。如果有一种方法可以重新排序连接以提高性能,那么这就是查询优化器的工作。

理论上,你不应该担心它 - 这是SQL的重点。试图超越查询优化器通常不会给出更好的结果。特别是在MS SQL Server中,它有一个非常好的查询优化器。

我不希望这个查询需要40秒。您可能没有定义正确的索引。您应该使用SQL Server ProfilerSQL Server Database Engine Tuning Advisor等工具来查看是否可以推荐任何新索引。

答案 1 :(得分:2)

查询优化器将使用表上收集的约束,索引和统计信息的组合来构建执行计划。在大多数情况下,这很有效。但是,我偶尔会遇到执行计划选择不当的情况。通常,调整查询可以有效地强制优化器选择更好的计划。我不能提供这样做的一般规则。当所有其他方法都失败时,您可以使用FORCE ORDER query hint

是的,连接顺序会对查询的执行时间产生重大影响。我们的想法是,通过连接产生最小结果的表,首先会使下一个连接更快地计算出来。 编辑但重要的是要注意,在FORCE ORDER的绝对值和所有其他条件相同的情况下,您在查询中指定的顺序可能与优化程序的方式无关制定执行计划。

答案 2 :(得分:1)

通常,SQL Server足够聪明,可以选择最佳的连接方式,它不仅会使用您在查询中编写的顺序。也就是说,如果所有内部联接都是第一个然后是左联接,我发现理解复杂查询会更容易。