Tah*_*aza 7 sql-server indexing optimization query-optimization
你好SQL Server引擎专家; 请与我们分享您的见解......
据我了解,非聚集索引上的INCLUDE列允许将附加的非键数据与索引页一起存储.
我很清楚聚簇索引对非聚集索引的性能优势,这仅仅是因为引擎在检索中必须采取的步骤减少1才能到达磁盘上的数据.
但是,由于INCLUDE列存在于非聚集索引中,因此可以预期以下查询在方案1和方案2中具有基本相同的性能,因为可以从方案2中的索引页检索所有列,而不是诉诸表数据页?
QUERY
SELECT A, B, C FROM TBL ORDER BY A
Run Code Online (Sandbox Code Playgroud)
情景1
CREATE CLUSTERED INDEX IX1 ON TBL (A, B, C);
Run Code Online (Sandbox Code Playgroud)
情景2
CREATED NONCLUSTERED INDEX IX1 ON TBL (A) INCLUDE (B, C);
Run Code Online (Sandbox Code Playgroud)
实际上,具有覆盖包括列的非聚集索引可以扮演与聚簇索引完全相同的角色.成本是在更新时:更多包含列意味着当在基表(在聚簇索引中)中更改包含的列值时,必须更新更多索引.此外,如果包含更多列,则数据大小会增加:数据库变大,这会使维护操作复杂化.
最后,您需要在附加索引的覆盖值和更多包含的列与更新成本和数据大小增加之间找到平衡.
对于此示例,使用非聚集索引实际上可能会获得更好的性能。但是,这实际上取决于您未提供的其他信息。以下是一些想法。
SQL Server 将信息存储在 8KB 页中;这包括数据和索引。如果您的表仅包含 A、B 和 C 列,那么数据将存储在大约相同数量的数据页和非聚集索引页中。但是,如果表中有更多列,那么数据将需要更多页。索引页的数量不会有任何不同。
因此,在列数多于查询需要的表中,查询将更好地使用非聚集覆盖索引(包含所有列的索引)。它将能够处理更少的页面来返回您想要的结果。
当然,只有当您获得大量行时,性能差异才可能显现出来。