Question is similar to this one,但答案似乎没有回答这个问题。
我对聚集列存储表的理解(如果我错了,请纠正我)是每列都以某种物理有序的方式存储,这意味着每列已经具有相当于聚集索引的内容。如果是这种情况,那么在表上添加更多索引就没有多大意义......或者会吗?也许是综合指数?
我的想法对吗?
Question is similar to this one,但答案似乎没有回答这个问题。
我对聚集列存储表的理解(如果我错了,请纠正我)是每列都以某种物理有序的方式存储,这意味着每列已经具有相当于聚集索引的内容。如果是这种情况,那么在表上添加更多索引就没有多大意义......或者会吗?也许是综合指数?
我的想法对吗?
所有列都按相同的顺序排序。我这样说是为了与您的陈述的可能阅读区分开来,即每列都以该列的最佳方式排序,这是不正确的。
每一列在每一行组内的一个段中单独编码和压缩。操作顺序为:
从压缩的角度来看(主要是游程编码),选择的常见排序顺序可能对某些段很好,但对其他段则不然。SQL Server 使用 Vertipaq 技术来选择能够提供良好整体压缩结果的排序顺序。
这不是正确的心理图景,因为列存储“索引”不支持查找,只有 b 树支持。SQL Server 可以在列存储中定位单个行以进行查找(如在链接的问答中),但这与通常支持键搜索不同。
对聚集列存储索引进行查找的演示。
区别在于查找行组#m 中的行#n 与查找特定列的给定值'x' 的行。列存储索引可以做前者,但不能做后者。
此外,b-tree 索引可以返回有序数据;列存储索引不能(由于编码) - 除了最多返回一行的查找的琐碎情况。
当我们需要定位单个值或小范围的值时,额外的 b-tree 索引是有意义的。另一种方法是扫描列存储索引(尽管如果星号正确对齐,则可能会消除行组 - 如果表已分区,则可能会消除分区)。
更一般地说,b-tree 索引支持 OLTP 类型的查询;列存储用于分析。在同一张表上提供两者可以实现混合方法(HTAP - 混合事务/分析处理)。
来自 Microsoft Research 论文Columnstore 和 B+ 树 – 混合物理设计重要吗?(PDF):
这样做是有意义的,是的。有时需要通过主键或唯一约束来强制执行业务需求。这两种方法都会在具有聚集列存储索引的表上生成基础索引。
对于某些类型的查询,聚集列存储索引不是一个好的数据结构。可能性能极差的示例包括SQL Server 2016 上的字符串聚合、递归查询和没有相等条件的连接。更一般地,任何需要从表中快速查找少量数据的查询可能无法仅从聚集列存储索引中看到最佳性能。确实,行组消除有时会导致与非聚集索引相似的性能,但这需要按特定顺序加载数据,并且并非所有数据类型都受支持。
在具有聚集列存储索引的表上创建非聚集索引有一些缺点。并行插入不再可用,索引占用额外的存储空间,SQL Server 在某些场景下压缩顺序的选项会减少。
根据我的经验,我发现在考虑将非聚集索引添加到具有聚集列存储索引的表时,最好设置比平时更高的标准。如果您真的需要它,请尝试添加它,但请记住它的缺点。