2010-01-28 32 views
6

说我有类似下面的查询:JOIN的顺序是否有所不同?

SELECT t1.id, t1.Name 
FROM Table1 as t1 --800,000 records 
INNER JOIN Table2 as t2 --500,000 records 
ON t1.fkID = t2.id 
INNER JOIN Table3 as t3 -- 1,000 records 
ON t1.OtherId = t3.id 

我会看到性能提升,如果我改变了我的加入对表2和表3的顺序。请看下图:

SELECT t1.id, t1.Name 
FROM Table1 as t1 --800,000 records 
INNER JOIN Table3 as t3 -- 1,000 records 
ON t1.OtherId = t3.id 
INNER JOIN Table2 as t2 --500,000 records 
ON t1.fkID = t2.id 

我听说查询优化器将尝试确定最佳的顺序,但并不总是奏效。您使用的SQL Server版本是否有所作为?

回答

6

连接顺序没有区别。

有什么有所作为是确保您的统计数据是最新的。

检查统计数据的一种方法是在SSMS中运行查询并包含实际执行计划。如果估计的行数与执行计划的任何部分使用的实际行数非常不同,那么您的统计数据会过期。

重建相关索引时重建统计信息。如果您的生产维护窗口允许,我会每晚更新统计数据。

这将更新统计信息数据库中的所有表:

exec sp_MSforeachtable "UPDATE STATISTICS ?" 
+0

我该如何检查?我应该多长时间更新一次我的统计资料是否有一个很好的经验法则? – 2010-01-28 00:47:27

+0

实际执行计划中是否包含预计和实际行?所以,如果它估计1行,它返回数千,那么我可能需要更新我的统计数据?如果我加入临时桌子,它会有所作为吗? – 2010-01-28 01:06:34

+0

另外,如果加入视图,统计是否会有所作为? – 2010-01-28 01:22:34

1

查询优化器应该很容易处理这些是完全一样的查询,并制定出这样做的最佳方式。

大部分是关于统计的记录数量。例如,如果t1.fkID中的绝大多数值是相同的,则此信息可能会影响QO。

3

仅当您指定OPTION (FORCE ORDER)时,连接顺序才会有所不同。否则,优化器将以它认为最有效的方式重新排列您的查询。

实际上,在某些情况下,我发现我需要使用FORCE ORDER,但它们当然很少。如果您不确定,只需要SET STATISTICS [TIME|IO] ON并亲自体验。在大多数情况下,如果不是所有情况,您都可能发现版本运行速度比优化版本慢。

相关问题