在索引中将列添加到 INCLUDE 的影响
Posted
技术标签:
【中文标题】在索引中将列添加到 INCLUDE 的影响【英文标题】:Effects of adding columns to INCLUDE in an index 【发布时间】:2021-12-17 20:09:05 【问题描述】:我在 EmpId 上有一个索引。我想在索引中包含几列。
Create Index IX_01_EmpId On empTable(EmpId) INCLUDE (name, dept, salary, joining_dt).
我知道包含的列通过避免键查找来加快查询速度。它们如何影响插入/更新/删除语句的性能?当对表执行任何插入/更新/删除语句时,索引表的幕后会发生什么?
【问题讨论】:
任何关于我们部件性能的想法很大程度上都是猜测,但有很多我们不知道,甚至可以猜测。表中有多少列,它们的数据类型是什么?目前有多少行? CRUD 操作多久运行一次,平均添加/更新/删除多少行? (是否有实际删除?不应该有。只是逻辑删除,即更新......)对于大多数员工表,没有太多 CRUD 操作,但也许这是一个异常值? 听起来你对covering index感兴趣。 【参考方案1】:IMO,性能影响更多的是在 SELECT 方面。
选择时,您可以使用索引。如果您执行了许多显示这些列的查询,并且您已将它们包含在索引中,那么它将避免您所说的键查找。这样做的代价是索引的每个页面(SQL 将所有内容存储在 8KB 页面中)现在包含更少的行,因为它们更大。因此,使用索引的同一查询将花费更长的时间,因为它必须扫描(查找)更多页面。包含的列越多,这种效果就越强。
当你执行 INSERT/UPDATE/DELETE 时,SQL server 必须维护这个索引。它将相应地修改页面数据。我敢打赌,只要它必须从索引中插入/更新/删除“行”并触摸其页面,它就不会产生太大的影响。
【讨论】:
以上是关于在索引中将列添加到 INCLUDE 的影响的主要内容,如果未能解决你的问题,请参考以下文章