SQL Server 2016 —— 聚集列存储索引的功能增强

  • Jonathan Allen
  • 邵思华

2015 年 6 月 14 日

话题:架构

聚集列存储索引(CC Index)是 SQL Server 2014 中两大最引人瞩目的特性之一,设计为用于超过 1 千万条记录的数据表。使用者无需明确的指定索引,也能够保证分析式查询的优良性能。

但 2014 版本中的这一特性存在着一个缺陷,即使用者无法指定索引。虽然 CC 索引比起传统表的表扫描要快得多,但它还是及不上经手动调整的覆盖索引。因此,为了同时支持这两种模式,开发者不得不创建两张表:一张具有 B 树索引结构的普通表,以及一个使用了聚集列存储索引的表。显然,保持这两张表的同步是一个很大的挑战。

在 SQL Server 2016 中,这个问题将不复存在。在兼容级别 130(即 SQL Server 2016)中的聚集列存储索引可包含 B 树风格的二级索引,与传统的数据表一样。这种索引支持任何数量的列,并且可以进行筛选。

聚集列存储索引的另一个问题在于缺乏对于主键和外键的支持。由于数据库无法强制某个 CC 索引的引用完整性,只能由中间层的开发者保证不会出现数据损坏的情况。如今因为能够在 CC 索引中加入 B 树索引,使用者就能够“使用一个 B 树索引创建主键与外键,从而实现这些限制条件的强制实施”。

警告:“一旦为聚集列存储索引定义了 B 树索引,就不能够使用 MERGE 了。”

隔离级别

从 SQL Server 2016 开始,CC 索引支持快照与读提交快照两种隔离级别了,因而无需再使用读 - 写锁,也使得频繁写入数据的表的性能表现更为出色。

索引碎片整理

在 SQL Server 2014 中的 CC 索引被设计为主要用于添加数据风格的操作。虽然也能够对记录进行修改和删除操作,但这会产生索引碎片,只有通过重建整个 CC 索引才能够消除这些碎片。而在 2016 中,可以通过重新组织索引操作减少碎片。索引的重新组织是一种在线操作,这表示它无需长时间占有锁,因此妨碍对表的查询操作。

批量模式的增强

由于 CC 索引与非聚集列存储索引使用了相同的存储引擎,因此它的批量模式也同样得到增强。

查看英文原文:SQL Server 2016: Clustered Columnstore Index Enhancements


感谢张龙对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

架构