【发布时间】:2011-06-24 08:11:29
【问题描述】:
我有一个名为 tbl_event 的数据库表,其中非聚集索引 IDX_Event_Folder 和 IDX_Event_Time 定义为:
CREATE NONCLUSTERED INDEX [IDX_Event_Folder]
ON [dbo].[tbl_event]([nobjectid] ASC)
CREATE NONCLUSTERED INDEX [IDX_Event_Time]
ON [dbo].[tbl_event]([tetime] ASC)
我运行了以下简单查询,并直接在下面显示了执行计划:
查询 1:
SELECT *
FROM tbl_event
WHERE tbl_event.nobjectid = 1410000
ORDER BY tetime
查询 2:
SELECT *
FROM tbl_event
WHERE tbl_event.nobjectid = 1410000
我的问题是,为什么 nobjectid 上的索引从未使用过?当在这些 select 语句的 where 子句中指定 nobjectid 时,我希望会有索引查找或扫描。我对这个分析的理解不正确吗?
【问题讨论】:
-
能否请您发布包含(!)主键定义的表定义?
-
表格有多少行?其中有多少具有
1410000的值? -
表中当前有18325170行,其中只有大约30行nobjectid=1410000
-
好的,这对我来说绝对是非常奇怪的,索引不会被使用。具有 1:610839 的选择性。你确定它没有被禁用?您可以在
sys.indexes中看到这一点。您是否还打开了自动创建统计信息和自动更新统计信息?另外,如果您尝试强制解决问题怎么办SELECT * FROM tbl_event WITH (INDEX = IDX_Event_Folder) WHERE tbl_event.nobjectid = 1410000
标签: sql-server indexing sql-execution-plan query-performance