首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么查询中没有使用特定的索引?

为什么查询中没有使用特定的索引?
EN

Stack Overflow用户
提问于 2011-07-08 03:10:29
回答 3查看 150关注 0票数 6

我有一个名为Workflow的表。它有37M行。ID列上有一个主键(int),外加一个附加列。ID列是索引中的第一列。

如果我执行以下查询,则不使用PK (除非我使用索引提示)

代码语言:javascript
复制
Select Distinct(SubID) From Workflow Where ID >= @LastSeenWorkflowID

如果我执行此查询,则使用PK

代码语言:javascript
复制
Select Distinct(SubID) From Workflow Where ID >= 786400000

我怀疑问题出在查询中使用参数值(我必须这么做)。我真的不想使用索引提示。有解决这个问题的办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-08 23:05:26

生成的计划必须在这两种情况下都有效。有一个阈值,在这个阈值上,对聚集索引的范围搜索比对非聚集索引的完全扫描更昂贵,原因很简单,因为聚集索引非常宽(它包括叶级别中的每一列),因此有如此多的页面要迭代。

您可以提供一个专门针对此查询的窄索引:

代码语言:javascript
复制
CREATE INDEX WorkflowSubId ON Workflow(ID, SubId);

或者:

代码语言:javascript
复制
CREATE INDEX WorkflowSubId ON Workflow(ID) INCLUDE (SubId);
票数 3
EN

Stack Overflow用户

发布于 2011-07-08 08:38:45

假设你的PK是一个身份或者总是大于0,也许你可以尝试这样做:

代码语言:javascript
复制
Select Distinct(SubID) 
From Workflow 
Where ID >= @LastSeenWorkflowID
    And ID > 0

通过添加第二个条件,可能会导致优化器使用索引查找。

票数 2
EN

Stack Overflow用户

发布于 2011-07-15 23:44:23

这是一个典型的局部变量产生次优计划的例子。

您应该使用OPTION (重新编译)来使用ID的实际参数值来编译您的查询。

有关更多信息,请参阅我的博客:http://www.sqlbadpractices.com/using-local-variables-in-t-sql-queries/

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

https://stackoverflow.com/questions/6615792

复制
相关文章

相似问题

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