2010-06-11 66 views
3

我有3分表表1(与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合并连接两者的连接。对于第一个查询,第一个合并与T1和T2,然后是T3。对于第二个查询,第一个合并与T1和T3,然后是T2。

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

所以我的问题是,联接顺序是否重要?

回答

3

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

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

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

1

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

2

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

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