SQL Server从2012版本开始支持列存储,但2012版本使用列存储会导致表进入只读状态;2014版本使用可更新聚集列存储索引技术解决了只读的问题,使用列存储的表支持修改;2016版本列存储支持操作分析,能够对事务工作负载运行高性能实时分析。
列存储索引是一种使用列式数据格式(称为“列存储”)存储、检索和管理数据的技术。聚集列存储索引是整个表的物理存储。
以下将对聚集列存储索引技术的实现方案进行分析。
目录
数据存储&划分
行组
关系型数据库中,数据以行写入,列存储首先需要将表的行数据划分为行组,再将行组中的列进行压缩,为了提高性能和压缩率,行组中的行数必须足够大,每个行组最多包含1,048,576 行。
列段
上面说到列存储首先要划分行组,再将行组中的列进行压缩,这里压缩的单位称为列段
物理存储
聚集列存储索引是整个表的物理存储,磁盘的每个Page仅仅存储来自单列的值。为了减少列段碎片和提升性能,列存储索引可能会将一些数据暂时存储到称为“增量存储”(DeltaStore)的聚集索引中。
增量行组
上面提到“增量存储”(DeltaStore),“增量存储”就是所有增量行组(B-tree结构)的统称。增量行组通过存储行数据,并在行数达到阈值后将行移入列存储,从而提升了列存储压缩率和性能。在增量行组达到最大行数后,它会关闭。 元组移动进程(tuple-mover) 会检查是否有已关闭行组。将已关闭的行组进行压缩,存储到列存储中。
Tuple Mover
当不断有数据插入列存储表的时候,DeltaStore中的数据会越来越多