SQL 服务器非聚集索引和查询优化器

SQL Server non-clustered index and the query optimizer

在我正在进行的一个项目中,有一个 table 有大约一百万条记录。为了获得更好的性能,我创建了一个非聚集索引并将 sid 字段定义为 index key column。当我执行这个查询时

SELECT [id]
      ,[sid]
      ,[idm]
      ,[origin]
      ,[status]
      ,[pid]
  FROM [EpollText_Db].[dbo].[PhoneNumbers] where sid = 9

执行计划如上图。我的问题是,为什么 SQL 服务器忽略 sid 索引 而扫描整个一百万条记录,以找到查询结果。非常感谢您的帮助

我认为问题出在结果的大小上。您正在从数据库中选择一万条记录,如果您考虑包含 index seek 操作的必要查询计划,这是相当多的。该计划包括 index seek 应该是这样的

因此,将包括一万次密钥查找和大量随机逻辑访问。因此,如果您的 table 行很小,他可以决定使用聚簇索引扫描。如果您真的很关心此查询的性能,请创建一个覆盖索引:

 CREATE INDEX idx_PhoneNumbers_sid 
    ON [EpollText_Db].[dbo].[PhoneNumbers](sid)
    INCLUDE ([id],[idm],[origin],[status],[pid])

但是,这可能会减慢插入、删除和更新的速度,并且还可能使您的 table 的大小增加一倍。