SQL Server 2005 - 内部联接的顺序

时间:2009-08-26 14:06:34

标签: sql sql-server tsql inner-join

我在Where子句中有一个包含三个内连接语句的查询。查询大约需要2分钟才能执行。如果我只是改变两个内连接的顺序,性能下降到40秒。

除了改变内部联接的顺序之外什么都不做会对查询性能产生如此巨大的影响?我原本以为优化器会想出这一切。

3 个答案:

答案 0 :(得分:8)

SQL是声明性的,也就是说,JOIN顺序无关紧要。

然而,实际上,如果它是一个复杂的查询,当优化器没有探索所有选项(理论上可能需要几个月)时,它可以在实践中。

另一种选择是,如果你重新排序并得到不同的结果,它是一个非常不同的查询,但这通常是使用OUTER JOINs。

它也可能是指定ON子句的方式如果重新排序FROM子句,它必须改变。除非你使用旧的(和坏的)JOIN-in-the-WHERE子句。

最后,如果这是一个问题,您可以使用括号来更改评估顺序,以使您的意图明确,比如,首先过滤大表以生成派生表。

答案 1 :(得分:4)

因为通过更改连接的顺序,SQL Server为您的查询提出了不同的执行计划(可能会改变它根据您的连接过滤表的方式)。

在这种情况下,我猜你有几个大表...其中一个表执行大部分过滤。

在一个查询中,您的联接将多个大表连接在一起,然后在最后过滤记录。

另一方面,您将第一个表格过滤到数据的一个小得多的子集...然后加入其余的表格。由于在加入其他大型记录集之前已初始化该初始表格,表现要好得多。

您可以随时验证,但在启用“显示查询计划”选项的情况下运行查询,并查看两个不同联接订单的查询计划。

答案 2 :(得分:-1)

我原本认为它也足够聪明,但显然它仍按照你明确列出它们的顺序执行连接...至于为什么会影响性能,如果第一个连接产生中间结果在一个订购方案中仅设置100个记录,然后第二个连接将从该100个记录集到第三个表。 如果先放入另一个连接会产生一百万条记录的第一个中间结果集,那么第二个连接将从一百万行结果集到第三个表...

相关问题