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 的大小增加一倍。
在我正在进行的一个项目中,有一个 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 的大小增加一倍。