浅谈SQL Server 2012列存储索引技术
作者:李可
来源:《计算机光盘软件与应用》2012年第19期
作者:李可
来源:《计算机光盘软件与应用》2012年第19期
摘要: 为了提高数据库的查询性能,SQL Server 2012提出了在表中创建列式索引。本文阐述了列存储索引的存储原理及使用列存储索引的优势与局限,旨在可以让用户通过列式索引卓越的性能挖掘交互式的探索数据,从而通过现有数据获得更多的商业价值。
关键词: SQL Server 2012;列存储;索引
中图分类号:TP392 文献标识码:A 文章编号:1007-9599 (2012) 19-0000-02
1 概述
SQL Server 2012 通过采用列式存储的索引,大大提高了数据仓库的查询效率。这种全新的索引与其它新功能相结合,在一些特定应用场景下可以将数据仓库的查询性能提高数百倍甚至数千倍,对于一些决策支持类的查询,通常也可以达到10倍左右的性能提升。这些性能的提升,都是通过大家所熟悉的T-SQL语句以及SQL Server管理界面所实现的,因此可以和包括S
QL Server Reporting Services在内的所有报表解决方案完全兼容。
2 行存储与列存储的优缺点
列存储索引对每列的数据进行分组和存储,然后联接所有列以完成整个索引。这不同于传统索引,传统索引对每行的数据进行分组和存储,然后联接所有行以完成整个索引。
2.1 行存储与列存储
首先,让我们了解一下什么是列存储。我们知道,在SQL Server里,Page是数据存储的基本单位,而数据行是实际数据的存储单位,它们从Page Header之后就开始依次存储在Page上。这种按行在Page上存储记录的方式就是行存储。当数据是按单列而不是多行进行连续存储时,就是所谓的列存储。
2.2 行存储的缺点
如图2.1所示,SQL Server在处理查询时通常是提取全部索引页,包括查询中用不到的那部分,也就是说,读取所有列的记录,即便是有些不需要。把不需要的数据读取出来,不仅浪费大量内存,同时也增大I/O,对系统的整体性能有着很大的影响。
2.3 列存储的优势
如图2.1所示,磁盘的每个Page仅仅存储来自单列的值,而不是整行的值。因此,压缩算法会更加高效,因为它们能够作用于同类型的数据。例如,假定我们有一张有3列数据的表,这3列从左往右依次是int、varchar和bool类型,并且该表有100条(行)记录。对于都是int类型的第一列数据,应用压缩算法是很容易的,同时压缩率也会很高。这也将表明,我们不必访问该表的所有列,仅需访问感兴趣的相关列的子集,这从另一方面来讲,可以减少磁盘的I/O、提升缓存,因此,磁盘存储会被更加高效低利用,就像索引维护一样。
3 列存储的特征与局限
3.1 SQL Server 列存储技术的主要特征
分列数据格式:每次对一个列的数据进行分组和存储。 SQL Server 查询处理可以利用新的数据布局,并显著改进查询执行时间。加快查询结果:列存储索引由于以下原因而可更快地生成结果:
(1)只须读取需要的列。因此,从磁盘读到内存中、然后从内存移到处理器缓存中的
数据量减少了。
(2)列经过了高度压缩。这将减少必须读取和移动的字节数。
(3)大多数查询并不会涉及表中的所有列。 因此,许多列从不会进入内存。 这一点与出的压缩方法相结合,可改善缓冲池使用率,从而减少总 I/O。
(4)高级查询执行技术以简化的方法处理列块(称为“批处理”),从而减少 CPU 使用率。
3.2 列存储索引的局限性
(1)包含的列数不能超过 1024。
(2)无法聚集。 只有非聚集列存储索引才可用。
(3)不能是唯一索引。
(4)不能基于视图或索引视图创建。
(5)不能包含稀疏列。
(6)不能作为主键或外键。
(7)不能使用 ALTER INDEX 语句更改。 而应在删除后重新创建列存储索引。
(8)不能使用 INCLUDE 关键字创建。
(9)不能包括用来对索引排序的 ASC 或 DESC 关键字。 根据压缩算法对列存储索引排序。 不允许在索引中进行排序。 可能按照搜索算法对从列存储索引中选择的值进行排序,但是必须使用sqlserver2012数据库还原 ORDER BY 子句来确保对结果集进行排序。
(10)不以传统索引的方式使用或保留统计信息。
(11)无法更新具有列存储索引的表。
内存受限的影响:列存储处理针对内存中处理进行了优化。 SQL Server 实现了若干机制,使得数据或大多数数据结构可以在可用内存不足时溢出到磁盘。 如果存在严重的内存限制,则处理过程将使用行存储。 在某些实例中,可能会选择列存储索引作为访问方法,但内
存不足以生成所需数据结构。 通过先以列存储操作开始,然后默认为一个较慢的代码路径,在查询遇到严重内存限制时,可能会导致性能出现一定程度的降低。 任何查询的有效内存要求取决于特定的查询。生成列存储索引要求的内存量大约为:8 MB×索引中的列数×DOP(并行度)。通常,内存要求随着作为字符串的列的比例提高而增加。 因此,降低 DOP 可以减少生成列存储索引所需的内存。
一些表达式的计算将比其他表达式更快:当使用列存储索引时,应使用批处理模计算某些常见表达式,而不以一次一行的模式进行计算。 除了使用列存储索引所带来的优势之外,批处理模式还将提供其他查询加速效果。 并不为批处理模式处理启用每个查询执行运算符。
列存储索引不支持 SEEK:如果查询应返回行的一小部分,则优化器不大可能选择列存储索引(例如:needle-in-the-haystack 类型查询)。如果使用表提示 FORCESEEK,则优化器将不考虑列存储索引。
列存储索引不能与以下功能结合使用:页和行压缩以及 vardecimal 存储格式(列存储索引已采用不同格式压缩),复制,更改跟踪,变更数据捕获,文件流。
4 结论
SQL Server 2012所提供的列式索引及其相关查询功能在技术上取得了突破性的进展,可以为数据仓库查询提供空前的性能优势。企业的最终用户可以使用熟悉的报表工具,在更短的时间内从数据中获取商业价值,他们将成为最主要的受益者。
参考文献
[1]尹东方.列式存储在知识发现系统中的应用与实现[D]/中国优秀硕士学位论文全文数据库[DB].,2010(07).
[2]石菲.列式数据库持续突破[J].中国计算机用户,2009,(09):.
[3]李静 孙莉 王梅.列存储数据查询中的连接策略选择方法[J].计算机科学与探索,2010,4(9):850-858.
[作者简介]李可(1978-),男,吉林人,讲师,研究方向:数据挖掘。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论