我有一个名为tbl_event的数据库表,其非聚集索引IDX_Event_FolderIDX_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!



因此,我很确定您必须禁用自动更新统计信息?如果是这样,您将需要手动更新统计信息(或最好启用此选项)

10-06 05:06