JOIN的顺序是否有所作为?

时间:2010-01-28 00:32:41

标签: sql-server

说我有类似下面的查询:

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

如果我在Table2和Table3上更改了联接的顺序,我会看到性能提升吗?见下文:

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版本是否有所不同?

3 个答案:

答案 0 :(得分:6)

连接的顺序没有区别。

有什么不同之处在于确保您的统计信息是最新的。

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

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

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

exec sp_MSforeachtable "UPDATE STATISTICS ?"

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

查询优化器应该可以轻松地将这些作为完全相同的查询来处理,并找出最佳方法。

很多事情都是关于统计数据而不是记录数量。例如,如果t1.fkID中的绝大多数值相同,则此信息会对QO产生很大影响。