我有以下疑问:
SELECT MAX([LastModifiedTime]) FROM Workflow工作流表中大约有400M行。LastModifiedTime列上的索引如下所示:
CREATE NONCLUSTERED INDEX [IX_Workflow_LastModifiedTime] ON [dbo].[Workflow]
(
[LastModifiedTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100)执行上面的查询需要1.5分钟。为什么SQL Server不使用上面的索引并简单地检索索引中的最后一行以获得最大值?
顺便说一句,这个查询的查询计划显示了对上面的索引执行的index scan。
谢谢。
发布于 2010-05-28 03:40:02
查询优化器的方式很神秘...
如果可能,我建议您像这样更改查询:
SELECT TOP (1) [LastModifiedTime]
FROM Workflow
ORDER BY [LastModifiedTime] DESC;这在语义上是相同的,优化器将不再考虑使用MAX aggregate和scan (显然它现在正在考虑)。它可能会考虑在工作表中进行排序,但希望这样的计划的估计成本将比反向排序的成本大得多。
至于为什么优化器选择一个明显糟糕的计划,通常涉及许多因素,仅从SO帖子很难诊断。通常,拥有ASC索引并不总是能弥补缺少DESC索引的情况,并且您的特定列统计信息(分布)可能已经达到了查询优化器内部的某个临界点,它决定选择scan+aggregate而不是相反的scan+top。
https://stackoverflow.com/questions/2923950
复制相似问题