SQL Server On Linux(26)——SQL Server on Linux 性能(10)——列存储索引简介

本人新书上市,请多多关照:《SQL Server On Linux运维实战 2017版从入门到精通》

在这里插入图片描述

本文介绍SQL On Linux上的性能提升功能,列存储索引,实际上这个并不仅仅是Linux上才有,所有平台的SQL Server包括windows、linux和云平台都有,而且在本人工作中用了不少,所以做个技术分享。

前言

  在SQL 2012之前,我们能用到的所有索引都是“行存储索引”,SQL 2012首次引入列存储索引。首先,列存储是数据以逻辑上组织成一个行列形式的表,但是物理存储上又是按照按列的数据方式存储的。
  相对来说,行存储是物理和逻辑上都按行的方式存储数据的格式。它是SQL Server表和索引的标准存储结构。
  列存储索引,通过按列存储的结构,大幅度提升性能(体现在大幅度降低实际存储空间)。其中涉及了高效的数据压缩,数据消除和批模式模式(batch mode execution)。
  列存储首先强项是压缩,而且是垂直压缩,虽然压缩功能从2008已经有,但是是基于行压缩,本人公司的项目中,数据表的列可多大4~600列,这种宽表的行压缩往往是失败的。因为超过了8096bytes的限制。而列压缩就没有这种限制。因为它已经是全新的压缩模式。如果能搭配in-memory内存技术,效果会更加好。压缩使得数据更小,很有可能完全加载到内存中而不引入额外的磁盘I/O,从而大幅度提升空间利用率,而且更小的空间使得索引的体积更小,从而进一步提升索引的效率。正如我以前说过的,在这些年来我个人的经验总结里面,性能优化实际上就是一个字“少”。

基础概念

  前面的文章提到过列存储的性能测试,但是没有从头说起,所以这里补一下。列存储的核心概念有下面几个,请不要忽视概念,因为在troubleshooting的过程中,很多概念的东西反而能帮你理清思路和减少弯路。

  1. 行组(rowgroup):一个行组内的行,可以被同时压缩成一个列存储格式并组合在一起。每个行组通常可包含的最大行数是 1,048,576 行。
  2. 片段(segment):在行组中,数据列的一个区间。每个行组中的每列包含一个segment,最终组成列存储索引。SQL Server首先把数据切片成行组,然后在组内压缩每个片段。
  3. 聚集列存储索引(clustered columnstore index):整个表都以一个列存储索引来存储,此后你不能创建常规的聚集索引,但是可以创建常规的非聚集索引。
  4. 非聚集列存储索引(nonclustered columnstore index):某些列组成一个索引,以列存储的格式存在基本表上面。这个时候可以创建常规的行存储聚集索引。
  5. 增量行组(delta rowgroup):少量数据进入聚集列存储索引之前,会先放到增量行组中,知道填满102400行时才进行一次性压缩。这个增量行组由SQL Server自动创建,因此一旦增量行组达到了足够的数量,就会压缩成一个列存储行组。

  列存储之所谓高效,主要在下面三个特点:

  1. 压缩:聚集列存储索引是表的本身,通常可以把堆表的体积降低到原来的1/5~1/8,有些可以到1/10。这是的数据可以更容易地完全载入内存,同时经过业界的努力,列存储的压缩算法是很高效的。
  2. 数据消除:Data elimination,当数据以列形式存储时,SQL Server可以在查询中跳过不必要的列。另外SQL Server还能知道列片段中哪些行组是查询所需的。这个概念成为行组消除。有点像分区的分区消除。
  3. 批执行模式:Batch Mode execution,这个是从列存储出现以后才出现的。用于查询优化器一次性处理多个相关行而不是传统的一行一次。这种方式可以极大提高性能。另外从SQL 2017引入的adaptive query processing(自适应查询处理)可以通过这种方式,提供智能查询执行。

何时使用

  每当出现新功能,我总会被问到什么时候用这些新功能?简单来说就是什么时候使用列存储索引,什么时候使用传统的聚集或非聚集b-tree索引,也叫行存储索引。
  对于聚集列存储索引。首先要了解你的系统负载,是否何时使用聚集列存储索引,聚集列存储索引最合适针对数据仓库,绝大部分以读为主。如果不是数据仓库,通常不需要用到聚集列存储索引。
  对于非聚集列存储索引。那什么时候用呢?它挺适合OLPT类型的系统,但是最合适那些范围查询而不是精确查询,同时范围查询也应该包含比较多的数据,如果非要给一个值,可能是超过100行。另外也尽量针对select和where中出现的列进行索引化而不是全表使用一个非聚集列存储索引。这种工作负载通常叫做混合事务分析处理(Hybrid Transactional Analytical Processing, HTAP), 官方也叫实时操作分析。如果测试结果并没有明显问题,那么优先建议使用列存储索引来应对这种负载,详细内容可以看官方文档“根据需要选择最佳的列存储索引
  对于行存储索引,同样可以看上面的文章。

小结

  本篇以简介为基础,后面的文章逐步深入介绍。

发布了192 篇原创文章 · 获赞 1268 · 访问量 250万+

猜你喜欢

转载自blog.csdn.net/DBA_Huangzj/article/details/104728829