是否有任何理由在聚集索引中只有 1 页的表上使用非聚集索引?

BCM*_*BCM 5 sql-server index-tuning sp-blitzindex

我在 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
Run Code Online (Sandbox Code Playgroud)

聚集索引似乎没有被读取,但我认为它可以没有其他索引。更有趣的细节,sp_BlitzLock 显示了这个数据库中的 39 个死锁,所有 39 个都涉及这个小表,我觉得这很有趣。

Dav*_*oft 6

非聚集索引甚至重要吗?

是的。您有此表(或其子集)的多个副本,并且必须在所有副本之间协调更新。非聚集索引可能不会提高查询性能,但它们可能是导致死锁的原因。

但是对于 SELECT 查询性能,非聚集索引应该无济于事。