首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >帮助进行简单的查询--为什么没有使用索引?

帮助进行简单的查询--为什么没有使用索引?
EN

Stack Overflow用户
提问于 2010-05-28 02:48:20
回答 7查看 296关注 0票数 3

我有以下疑问:

代码语言:javascript
运行
复制
SELECT MAX([LastModifiedTime]) FROM Workflow

工作流表中大约有400M行。LastModifiedTime列上的索引如下所示:

代码语言:javascript
运行
复制
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

谢谢。

EN

Stack Overflow用户

回答已采纳

发布于 2010-05-28 03:40:02

查询优化器的方式很神秘...

如果可能,我建议您像这样更改查询:

代码语言:javascript
运行
复制
SELECT TOP (1) [LastModifiedTime]
FROM Workflow 
ORDER BY [LastModifiedTime] DESC;

这在语义上是相同的,优化器将不再考虑使用MAX aggregate和scan (显然它现在正在考虑)。它可能会考虑在工作表中进行排序,但希望这样的计划的估计成本将比反向排序的成本大得多。

至于为什么优化器选择一个明显糟糕的计划,通常涉及许多因素,仅从SO帖子很难诊断。通常,拥有ASC索引并不总是能弥补缺少DESC索引的情况,并且您的特定列统计信息(分布)可能已经达到了查询优化器内部的某个临界点,它决定选择scan+aggregate而不是相反的scan+top。

票数 3
EN
查看全部 7 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2923950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档