SQL Server性能:非聚集索引+ INCLUDE列与聚簇索引 - 等效?

时间:2010-08-02 01:36:26

标签: sql-server optimization indexing query-optimization

Hello SQL Server引擎专家;请与我们分享您的见解......

据我了解,非聚集索引上的INCLUDE列允许将附加的非键数据与索引页一起存储。

我很清楚聚簇索引对非聚集索引的性能优势,因为引擎必须在检索中减少1步才能获得磁盘上的数据。

但是,由于INCLUDE列存在于非聚集索引中,因此可以预期以下查询在方案1和方案2中具有基本相同的性能,因为可以从方案2中的索引页检索所有列,而不是诉诸到表数据页?

QUERY

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);

2 个答案:

答案 0 :(得分:5)

实际上,具有覆盖包括列的非聚集索引可以扮演与聚簇索引完全相同的角色。成本是在更新时:更多包含列意味着当在基表(在聚簇索引中)中更改包含的列值时,必须更新更多索引。此外,如果包含更多列,则数据大小会增加:数据库变大,这会使维护操作复杂化。

最后,您需要在附加索引的覆盖值和更多包含的列与更新成本和数据大小增加之间找到平衡。

答案 1 :(得分:3)

对于此示例,您实际上可以使用非聚集索引获得更好的性能。但是,它实际上取决于您未提供的其他信息。这是一些想法。

SQL Server将信息存储在8KB页面中;这包括数据和索引。如果您的表只包含A,B和C列,则数据将存储在大致相同数量的数据页和非聚簇索引页中。但是,如果表中有更多列,则数据将需要更多页面。索引页面的数量不会有任何不同。

因此,在列数超过查询需求的表中,查询将更好地处理非聚集覆盖索引(包含所有列的索引)。它将能够处理更少的页面以返回您想要的结果。

当然,在获得大量行之前,可能无法看到性能差异。