概述
SQL Server 2012 通过采用列式存储的索引,大大提高了数据仓库的查询效率。这种全新的
索引与其它新功能相结合,在一些特定应用场景下可以将数据仓库的查询性能提高数百倍
甚至数千倍,对于一些决策支持类的查询,通常也可以达到10倍左右的性能提升。这些
性能的提升,都是通过大家所熟悉的T-SQL语句以及SQL Server管理界面所实现的,因此
可以和包括SQL Server Reporting Services在内的所有报表解决方案完全兼容。
列式索引将每一列单独存储在一组磁盘页中,而不是像传统方式那样在每个页中存储多个
行。我们通常使用“行存储”来描述每个页中包含多行数据的堆或者B树结构。
采用列式存储时,列将存储在不同的页组中,这样存储将带来以下好处:
. 只有查询所涉及到的列才会从磁盘中获取出来(在典型的事实数据表中,查询所涉
及到的列不会超过总列数的15%)
. 由于每个列中都会有大量重复数据,因此这种数据结构更便于进行压缩
. 数据经过高度压缩后,缓冲区的命中率将大大提高,并且访问频繁的列将缓存在内
存中,而访问不频繁的列则不会长时间占用内存
SQL Server 2012 列式索引采用“纯粹”的列式存储,而非混合模式,因为不同列中的所有
数据将会分开存储在不同的页中,这样一来I/O扫描的性能以及缓冲区的命中率将会大幅
提升。SQL Server是大型数据库产品中第一个支持纯列式索引的产品。虽然其它厂商声称
市场上大规模使用的数据库产品不可能提供纯列式存储技术,但很荣幸我们做到了这一点!
使用列式索引
为了提高查询性能,您所要做的就是针对数据仓库中的事实表创建列式索引。如果有非常
大的维度表(比如超过1000万条记录),您可以为其创建列式索引。接下来,您只需要
向SQL Server提交查询,然后查询的速度将会大大加快。
性能特性
列式索引针对星型联接查询进行了高度优化,但列式索引并不是万能的。事实表到事实表
之间的联接查询以及多列的联接查询很难通过列式索引大幅提高性能,甚至不会有任何性
能提升。OLTP系统中常用的查询(例如查询某条记录或者取出某条记录的所有列)往往
通过B树结构的索引要比列式索引更有助于提高性能。总之列式索引并不一定总能提高数
据仓库的查询性能。如果列式索引对当前查询没有性能提升,那么查询优化器将会选择堆
或者B树的方式访问数据。如果在这种情况下查询优化器没有自动选择性能更好的堆或B
树方式来访问数据,那么开发人员可以通过查询提示来使用堆或B树。
压缩
通过我们观察,在真实环境中对不同的事实数据表进行压缩,可以获得4-15倍的压缩比。
列式索引并非聚集索引,因此数据仍然采用行的方式进行存储。列式聚集索引其实就是数
据的一份拷贝,不仅可以大幅提高性能,而且还可以大大节省存储空间,不过该功能将在
后续版本中提供。
加载数据
在SQL Server 2012 中,创建了列式索引的数据表将不能够通过INSERT, UPDATE, DELETE, 以
及MERGE 语句进行操作,也不能进行大容量加载的操作。如果需要将数据导入到带有列
式索引的数据表中,可以通过分区切换的方式,或者先禁用列式索引,然后更新数据表,
最后再重建索引。针对分区数据表所创建的列式索引必须和分区对齐。大多数数据仓库用
户都会在每天晚上进行数据加载操作,并且在白天的时候将数据仓库设置为只读模式,因
此列式索引的这些限制不会有影响。
此外,您还可以使用UNION ALL 语句将带有列式索引的数据表和不带列式索引的可更新数
据表整合为一个逻辑视图,然后对该视图执行查询操作。这样就可以动态的将新数据插入
到一个单独的逻辑事实表中,同时最大限度的保留列式索引所带来的性能优势。
没有创建列式索引的数据表仍然可以进行更新,这样用户可以联机创建维度表,然后将其
与采用列式索引的事实表进行联接,从而响应连续的查询。这种方式非常实用,例如进行
零售分析时,需要将1000条产品信息分为一组,然后对其重复执行查询。这些产品的ID
字段可以放在维度表中,然后将这个维度表与采用列式索引的事实表进行联接操作。
在预发行版本中,创建列式索引所需的时间,大概是创建聚集索引所需时间的2-3倍。客
户需要在自己的ETL流程中考虑时间上的差异。虽然如此,客户往往无需对聚合结果进行
汇总,因此ETL的总体时间还是能节省下来。
列式索引带来的收益
列式索引通过卓越的性能,可以让用户交互式的探索数据,从而通过现有数据获得更多的
商业价值。 您可以在廉价的SMP服务器中快速查询数亿条记录,并在内存中缓存频繁访
问的数据。
列式索引同时还可以减轻IT部门的压力,并通过降低对聚合汇总(包括索引视图、用户定
义的汇总表、或者OLAP多维数据集)的依赖来缩短ETL的时间。设计并维护聚合运算通
常是耗时且棘手的工作,而一个简单的列式索引可以替代很多聚合运算。列式索引要比聚
合运算灵活的多,因为如果查询稍作更改,特定的聚合有可能无法提高查询性能,而列式
索引则依然可以提供很好的支持。
如果用户使用OLAP系统来提升查询性能,但却更倾向于使用T-SQL语句来编写查询,这
些用户可以借助列式索引技术,减少数据移动的操作,从而降低成本和复杂度。用户如果
使用OLAP工具所提供的报表功能、维度建模功能、预测功能、或者决策支持功能,则还
将继续从这些工具中获益。此外,用户现在还可以针对采用列式索引的SQL Server数据仓
库使用ROLAP,并且比之前的OLAP提供更好的性能,同时通过避免多维数据集构建的过
程而节省时间。
列式索引性能优势的来源
正如前文所介绍的那样,由于大多数查询只涉及到一个表的某几列,再加上压缩技术,因
此列式索引降低了数据从磁盘加载到内存的需求,从而大幅提高了性能。这只是性能提升
的一个因素,很多其它相关技术也会对性能产生影响,虽然这些技术我们没有详细介绍,
但有一点可以肯定—这些技术对性能的提升都是真实可信的!
结论
SQL Server 2012所提供的列式索引及其相关查询功能在技术上取得了突破性的进展,可以
为数据仓库查询提供空前的性能优势。企业的最终用户可以使用熟悉的报表工具,在更短
的时间内从数据中获取商业价值,他们将成为最主要的受益者。