首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 7

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

Stack Overflow用户

发布于 2010-05-28 02:57:56

我有一个具有类似日期-时间字段的表(假设这是您的数据类型)和4M行--是您的行的1%,但是当我单击“execute”时,几乎就返回了相同的查询。我的索引几乎和你的一样:

代码语言:javascript
运行
复制
CREATE NONCLUSTERED INDEX [IX_PartViewTrack_SearchDate] ON [dbo].[PartViewTrack] 

(
[SearchDate] 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) ON [PRIMARY]

执行计划显示了索引扫描。

只是为了露齿而笑-删除索引,看看需要多长时间?

票数 1
EN

Stack Overflow用户

发布于 2010-05-28 02:51:51

你能从执行计划中判断出它是否在使用索引吗?如果没有,表/索引最后一次分析是什么时候?如果它从未被分析过,也许SQL server仍然认为其中只有100行,所以进行表扫描会更快一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2923950

复制
相关文章

相似问题

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