索引中包含列的性能影响

Performance effect of include column in index

我们知道在 table 上有索引会降低 insert/update/delete (CUD) 性能。 我想知道如果我使用一个字段作为包含列,对 (CUD) 性能有多大影响。

我的意思是,比较以下指标之间的性能下降:

CREATE UNIQUE NONCLUSTERED INDEX [Idx1] ON dbo.Table (Col1, Col2)

CREATE UNIQUE NONCLUSTERED INDEX [Idx1] ON dbo.Table (Col1, Col2) INCLUDE (Col3)

备注:

  1. col3 是一个小字段(如int/decimal/date)
  2. table 大约有 1 亿行

如果 INCLUDE 列包含一个查询,则该查询可能会快得多。不利的一面是使用索引的其他查询可能会稍微慢一些。

未包含在该索引中的查询在使用该索引时可能会执行更多 I/O。添加 INCLUDE 列将扩大非聚集索引叶页上行的大小。更宽的行意味着更少的行适合单个叶页。使用此索引查找许多行的查询将不得不加载更多页面。

INCLUDE列会导致索引占用更多磁盘space。多少 space 取决于列的数据类型。

如果扫描很多行,索引可能会占用更多 space 内存。

确定 INCLUDE 列的影响的最佳方法是对其进行测量。 运行 查询前 table 并测量 I/O,磁盘 space,并记录查询计划。 运行 之后对其进行查询并执行相同的操作。