在索引中将列添加到 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 的影响的主要内容,如果未能解决你的问题,请参考以下文章

Create Index语句的Include作用

如何在 Qt4 中将项目添加到模型并获取新添加项目的索引

在 WooCommerce 中将列添加到管理订单列表

在mongodb中将字符串添加到整个列

为啥我不能在 python 诅咒窗口中将str()添加到最后一行/列?

如何从表中将列添加到现有视图? [复制]