技术开发 频道

SQL Server 2014 可更新聚集列存储索引

  四、空间占用比较

  可更新列存储聚集索引的压缩比率非常高,因为相同列中存放同一类数据,同类数据有更好的压缩比。由于INT类型的数据更容易有更高的压缩比,下面首先简单对一个600万行纯INT的表进行对比,来查看列存储的压缩比例,使用行存储和列存储的空间占用如图7所示。

空间占用比较
▲图7.不同存储占用空间

  由图7可以看出,使用行存储存671万数据大约需要188MB的空间,而列存储仅仅需要21MB 空间,使用列存储压缩后数据几乎只有行存储的1/9,压缩比率惊人。在2014中,微软对于列存储提供了进一步压缩选项,对于归档数据,可以使用列存储归档压缩方式,该方式使用了XPRESS压缩算法,可以使用下述T-SQL代码对列存储索引数据进行进一步压缩:

  ALTER TABLE dbo.Sales
  REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE) ;

  进一步压缩后,表空间占用如图8所示:

空间占用比较
▲图8.进一步压缩后的空间占用

  在图8看出,使用了归档列存储压缩,数据被压缩到15MB,相比较于188MB的行存储,空间占用只有1/12。

  上述例子表中只有INT类型列只是为了阐述列存储能够做到的压缩比率,与实际场景并不贴近,下面的例子采集于某客户的真实报表库,一个大表中有不同种类的字段类型,表结构如图9所示。

空间占用比较
▲图9.采集于真实系统的表结构

  首先,查看行存储下该表的数据量与大小,如图10所示。

空间占用比较
▲图10.示例表数据量与空间占用

  该表使用行存储有221万条左右数据,空间占用大约需要2GB左右。现在使用列存储索引,再次查看空间使用,如图11所示。

空间占用比较
▲图11 示例表使用列存储后数据量与空间占用

  由图11看出,列存储即使在比较复杂的表结构下,列存储空间占用只有行存储的三分之一。

  虽然列存储索引总是以压缩的形式存放数据,但还可以通过配置进一步对列存储索引进行压缩,这就是所谓的归档压缩。归档压缩如其名称所示,目的是对于表中的归档数据进行压缩,实现方式是通过在列存储索引上进行表分区,对归档数据再次进行压缩(比如按时间列进行归档,将去年以及之前的数据分到归档区中)以进一步减少空间占用。

  现在对列存储示例表中的数据按时间进行分区,2014年5月之前的数据分4个区,也就是所谓的归档区,2014年5月的数据是活动区,分区情况如图12所示。

空间占用比较
▲图12. 列存储示例表分区情况

  分区1-4是2014年5月1日以前的数据,业务上认为是历史数据,被使用的频率大大低于当前的“热”数据,因此可以利用列存储归档压缩对分区1-4进行进一步压缩:

  ALTER TABLE Result
  REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE ON PARTITIONS (1,2,3,4)) ;

  此时,列存储数据空间使用由751MB下降到495MB,而频繁被用到的分区5不受影响,如图13所示。

空间占用比较
▲图13.对归档分区压缩后,列存储索引空间占用

6
相关文章