关于聚簇索引和列存储索引我几乎没有问题。我们知道在聚簇索引中,特定列的数据的物理顺序正在改变并存储在二叉树的叶节点中。所以我的问题是:
1)如果我们在columnA上创建聚簇索引,那么columnA的数据将从实际存储位置中删除并添加到二叉树叶子中?或者它只是在原始存储位置重新排列数据?
2)列存储索引如何,此处还会从实际存储位置删除特定列中的数据并将其加载到另一个单独的文件段中?
3)从上面的2个问题,如果数据是从原始位置移动,例如:我们有一个tableA,有coulmns colA,colB和 如果我们在colA上创建上述2个索引中的任何一个,那么原始位置只包含colB数据?和colA在其他地方?
答案 0 :(得分:2)
1)创建聚簇索引时,表将重建为聚簇索引。没有“原始存储”,聚集索引是表,表是聚簇索引。聚簇索引被组织为B-tree结构(不要与二叉树混淆)。
2)columnstore非聚集索引是表的二级索引。与任何辅助(非群集)索引一样,非聚集索引中的每一行都是来自表基本堆或聚簇索引的数据的副本。列存储索引不是B树,也不是堆,而是针对面向列的存储进行了优化的新型数据组织。要了解面向列的存储如何工作,请阅读C-Store paper。
3)否。添加任何性质的非聚集索引(包括XML,空间和列存储等特殊索引)永远不会从表基本堆或聚簇索引中删除数据。非聚簇索引始终包含数据的副本。添加非聚集列存储索引不会以任何方式更改表基本堆或聚簇索引中的行和列(我怀疑您称之为“实际存储”)。