您好 SQL Server 引擎专家;请与我们分享您的一些见解...
据我了解,非聚集索引上的 INCLUDE 列允许将其他非键数据与索引页一起存储。
我很清楚聚集索引相对于非聚集索引的性能优势仅仅是因为引擎在检索中必须少执行 1 个步骤才能到达磁盘上的数据。
但是,由于 INCLUDE 列存在于非聚集索引中,是否可以预期以下查询在场景 1 和 2 中具有基本相同的性能,因为可以从场景 2 中的索引页检索所有列,而不是求助于表数据页?
查询
SELECT A, B, C FROM TBL ORDER BY A
场景 1
CREATE CLUSTERED INDEX IX1 ON TBL (A, B, C);
场景2
CREATED NONCLUSTERED INDEX IX1 ON TBL (A) INCLUDE (B, C);
最佳答案
实际上,具有覆盖包含列的非聚集索引可以起到与聚集索引完全相同的作用。成本是在更新时:更多包含列意味着当基表(在聚集索引中)中包含的列值更改时,必须更新更多索引。此外,包含的列越多,数据的大小就会增加:数据库变得更大,这会使维护操作复杂化。
最后,您必须在附加索引和更多包含列的覆盖值与更新成本和数据大小增加之间找到平衡。
关于sql-server - SQL Server 性能 : Non-clustered Index + INCLUDE columns vs. 聚集索引 - 等效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384493/