说我有类似下面的查询:
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版本是否有所不同?
答案 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产生很大影响。