索引中包含列的性能影响
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)
备注:
- col3 是一个小字段(如int/decimal/date)
- table 大约有 1 亿行
如果 INCLUDE
列包含一个查询,则该查询可能会快得多。不利的一面是使用索引的其他查询可能会稍微慢一些。
未包含在该索引中的查询在使用该索引时可能会执行更多 I/O。添加 INCLUDE
列将扩大非聚集索引叶页上行的大小。更宽的行意味着更少的行适合单个叶页。使用此索引查找许多行的查询将不得不加载更多页面。
INCLUDE列会导致索引占用更多磁盘space。多少 space 取决于列的数据类型。
如果扫描很多行,索引可能会占用更多 space 内存。
确定 INCLUDE 列的影响的最佳方法是对其进行测量。 运行 查询前 table 并测量 I/O,磁盘 space,并记录查询计划。 运行 之后对其进行查询并执行相同的操作。
我们知道在 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)
备注:
- col3 是一个小字段(如int/decimal/date)
- table 大约有 1 亿行
如果 INCLUDE
列包含一个查询,则该查询可能会快得多。不利的一面是使用索引的其他查询可能会稍微慢一些。
未包含在该索引中的查询在使用该索引时可能会执行更多 I/O。添加 INCLUDE
列将扩大非聚集索引叶页上行的大小。更宽的行意味着更少的行适合单个叶页。使用此索引查找许多行的查询将不得不加载更多页面。
INCLUDE列会导致索引占用更多磁盘space。多少 space 取决于列的数据类型。
如果扫描很多行,索引可能会占用更多 space 内存。
确定 INCLUDE 列的影响的最佳方法是对其进行测量。 运行 查询前 table 并测量 I/O,磁盘 space,并记录查询计划。 运行 之后对其进行查询并执行相同的操作。