我有一个名为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时会有索引查找或扫描。我对此分析的理解不正确吗?
最佳答案
您在注释中说,表中当前有18325170行,其中只有约30行的nobjectid = 1410000。
即使您的IDX_Event_Folder
索引被禁用,我也不敢相信SQL Server会为该行数选择此计划,并且行粗表示它认为它正在处理的可能不是1行,而是18325170!
因此,我很确定您必须禁用自动更新统计信息?如果是这样,您将需要手动更新统计信息(或最好启用此选项)