我最近在我维护的数据库中遇到了一个索引,其格式如下:
CREATE INDEX [IX_Foo] ON [Foo]
( Id ASC )
INCLUDE
( SubId )
在这种特殊情况下,我遇到的性能问题(对 Id 和 SubId 的缓慢 SELECT 过滤)可以通过简单地将 SubId 列移动到适当的索引中而不是作为包含列来解决。
然而,这让我想到,我根本不理解包含列背后的原因,一般来说,它们可能只是索引本身的一部分。即使我并不特别关心索引本身中的项目,在索引中包含列而不是简单地包含在内有任何不利之处。
经过一些研究,我知道对于可以进入索引列的内容有许多限制(索引的最大宽度,以及某些无法索引的列类型,如“图像”)。在这些情况下,我可以看到您将被迫在索引页数据中包含该列。
我唯一能想到的是,如果 SubId 有更新,如果包含列,则不需要重新定位行(尽管需要更改索引中的值)。还有什么我想念的吗?
我正在考虑浏览数据库中的其他索引,并在可能的情况下适当地移动索引中包含的列。这会是一个错误吗?
我主要对 MS SQL Server 感兴趣,但也欢迎提供有关其他数据库引擎的信息。