JOIN的顺序是否有所不同?
问题描述:
说我有类似下面的查询: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版本是否有所作为?
答
连接顺序没有区别。
有什么有所作为是确保您的统计数据是最新的。
检查统计数据的一种方法是在SSMS中运行查询并包含实际执行计划。如果估计的行数与执行计划的任何部分使用的实际行数非常不同,那么您的统计数据会过期。
重建相关索引时重建统计信息。如果您的生产维护窗口允许,我会每晚更新统计数据。
这将更新统计信息数据库中的所有表:
exec sp_MSforeachtable "UPDATE STATISTICS ?"
答
查询优化器应该很容易处理这些是完全一样的查询,并制定出这样做的最佳方式。
大部分是关于统计的记录数量。例如,如果t1.fkID中的绝大多数值是相同的,则此信息可能会影响QO。
答
仅当您指定OPTION (FORCE ORDER)
时,连接顺序才会有所不同。否则,优化器将以它认为最有效的方式重新排列您的查询。
实际上,在某些情况下,我发现我需要使用FORCE ORDER
,但它们当然很少。如果您不确定,只需要SET STATISTICS [TIME|IO] ON
并亲自体验。在大多数情况下,如果不是所有情况,您都可能发现版本运行速度比优化版本慢。
我该如何检查?我应该多长时间更新一次我的统计资料是否有一个很好的经验法则? – 2010-01-28 00:47:27
实际执行计划中是否包含预计和实际行?所以,如果它估计1行,它返回数千,那么我可能需要更新我的统计数据?如果我加入临时桌子,它会有所作为吗? – 2010-01-28 01:06:34
另外,如果加入视图,统计是否会有所作为? – 2010-01-28 01:22:34