我在 SQL Server 中有一个小但积极查询的表,其中有 94 行经常读取和/或更新。聚集索引安全地适合 1 个 8KB 页面,并且该页面上有大量空白空间。这使我相信任何未来的更新都不会将其推到第二页。
除了聚集索引之外,多年来还添加了几个非聚集索引。
我的问题是,在概念层面上,非聚集索引能否提高 SELECT 性能?如果 SQL Server 一次不能读取少于 1 个数据页,那么任何非聚集索引读取都可以通过读取聚集索引的单个页面来轻松满足,还是我误解了这个概念?
我不想包含表定义,但以下是该表上 sp_BlitzIndex 的一些统计数据,显示了它的用途:
ClusteredIndex Reads: 1 (1 scan) Writes:180,544,146
Nonclustered Index Reads: 0 Writes:103
Nonclustered Index Reads: 63,425,182 (57,447,576 seek 5,977,606 scan) Writes:180,544,146
Nonclustered Index Reads: 150,953,542 (150,953,542 seek) Writes:180,233,055
Nonclustered Index Reads: 0 Writes:311,091
聚集索引似乎没有被读取,但我认为它可以没有其他索引。更有趣的细节是,sp_BlitzLock 显示了这个数据库中的 39 个死锁,所有 39 个死锁都涉及这个小表,我觉得这很有趣。
是的。您有该表的多个副本(或它的子集),并且必须在所有副本之间协调更新。非聚集索引可能不会提高查询性能,但它们可能是导致死锁的原因。
但是对于 SELECT 查询性能,非聚集索引应该没有帮助。