【发布时间】:2016-12-11 01:48:52
【问题描述】:
假设我将一个表聚集在 (RetailerID, PurchaseDate, UserID) 上。这就是“聚集键”,聚集键总是包含在所有非聚集索引中。
https://stackoverflow.com/a/23057196/88409
https://stackoverflow.com/a/2747869/88409
接下来,我创建了一个以 (RetailerID, StoreID, PurchaseDate) 为键的非聚集索引“StorePurchasesIndex”,以加快仅包含特定商店子集的查找速度。
第一个问题是,我是否需要将UserID 显式包含为包含列,还是会通过包含它的集群键隐式包含它?我很确定在这种情况下我不需要明确包含UserID,但如果我错了,请纠正我。
我真正感兴趣的是,如果我明确地将UserID 包含为包含列会发生什么。它是否会冗余地包含在索引中,一次作为集群键的一部分,然后再次作为包含的列?或者 SQL Server 是否识别意图并避免将其存储两次,因为它已经通过集群键包含在内?
第二个问题是,如果不包含冗余,那么明确包含它是否有好处。例如,它是否会确保将来包含UserID,即使集群键发生更改以排除UserID 并重建索引?
【问题讨论】:
-
集群键列包含在每个非聚集索引的叶级中,这意味着一旦非聚集索引值被删除,数据就在那里找到 - 但它不在索引树中,因此不能用于搜索/过滤。并且 SQL Server 足够聪明,可以避免再次添加已经是索引叶级别的一部分的列 - 所以在您的情况下,添加集群键列只是没有意义和多余的
-
是的,但是使用包含列定义索引确保它保留在索引中,即使它从集群键中消失,对吧?
标签: sql-server indexing sql-server-2014 non-clustered-index clustering-key