SQL Server ->> ColumnStore Index(列存储索引)
Columnstored index是SQL Server 2012后加入的重大特性,数据不再以heap或者B Tree的形式存储(row level)存储在每一个数据库文件的页里面,而是以列为单位存储。加上本身数据在存储到磁盘的时候是经过压缩算法压缩过后存储的,对于存储空间有很大的节省。各个特点非常适合数据库仓库型数据库,尤其是星状结构的设计(Dimension + Fact)。
各个版本的特点和差异:
SQL Server 2014
1)聚集列存储索引,可更新,但是不能再创建其他的索引
2)非聚集列存储索引,不可更新,除非Rebuild或者Switch Partition,但是一些操作可以以批处理的形式处理
3)多了一个压缩选项COLUMNSTORE_ARCHIVE,压缩比例更高,对于不常访问的数据(年久远的数据)非常有帮助,节省磁盘和内存空间占用
4)支持更多的操作符使用多线程批处理,包括Sort、Union All、Group By、Scan
5)聚集列存储索引不支持主键和外键
SQL Server 2016:
1)除聚集列存储索引外,还可以再额外创建多个行存储索引
2)非聚集列存储索引可更新,而且可以再创建索引时加filter
3)In-memory table可以创建一条列存储索引
4)聚集列存储索引支持主键和外键
5)增加了COMPRESSION_DELAY选项可以延迟N分钟数据压缩
SQL Server 2014和2016最大的特点是多了数据批载入。
SQL Server 2016在插入数据到列存储索引时采用了与Bulk Insert类似的技术快速插入数据到目标表。
1)数据不经过排序就直接插入到表中
2)102400行数据作为每一个块,为满的就放到deltagoup
列存储的Bulk Load是可以并行的,把不同与行存储Bulk insert的并行需要通过加表锁来锁定整张表,列存储的Bulk insert是不需要加表锁,因为在进行行分组(row groups)的时候就已经对每一个分组都加了排它锁,然后压缩。
列存储也是最小化日志记录,但是行插入到deltastore还是会进行完整的日志记录
对row group加的锁是row group级别的,但是对deltagroup是页或者区级别的
如果单纯是为了把数据加载到一张stage表为后面的数据清洗和转换做准备,那么堆表(heap table)比起聚集列存储索引的表在载入速度上要更快。因为列存储需要对数据进行分组(row group),然后压缩后载入到磁盘。而堆表之所以快是因为第一它的数据是不需要任何排序和分组的(除非有做分区表),也不需要压缩,加上TABLOCK后数据载入最优化。而如果作为临时用的数据,临时表的速度要比堆表要更快。因为临时表是最小的事务日志记载。所以最常见的做法应该是把数据载入到stage表,然后从stage表载入到列存储索引。在载入数据到列存储索引的时候加TABLOCK可以使语句变成多线程处理(SQL Server 2016),加上数据在进入压缩后的列存储行组是最小日志记录的(进入delta group不是最小日志记录)。
下面语句可以把所有的row group都压缩,包括delta group,不管满了没有
ALTER INDEX <index-name> on <table-name> REORGANIZE with (COMPRESS_ALL_ROW_GROUPS = ON)
SQL Server 2016允许在列存储索引上再创建非聚集行索引,这样带来的好处是:
1)增加了对行数据的索引查找能力(index seek)
2)通过唯一索引实现主键的功能
3)数据更新时的锁优化,通过非聚集行索引实现行级别的锁,而对于列存储索引也只是row-group级别的锁
如果想让列存储聚集索引按照某个字段的排序存储,可以先对表的该列创建聚集索引,删除聚集索引,然后对表再创建列存储聚集索引,前提是DOP要设置为1。
Rowgroup elimination是SQL Server 2016的一大特性,可以帮助在查找数据的时候可以根据查询语句的谓语消除非必要的row group的扫描,也就是指扫描需要的row group。SQL Server是通过查找元数据,就是列存储索引的segment的最大和最小值区间来判断是否符合插叙语句的谓语条件来决定是否要扫描该row group的某个列的数据。sys.column_store_segments的min_data_id和max_data_id代表了上面的最大和最小值区间。而sys.column_store_row_groups则记录了表所创建的列存储索引的row group,可以用于判定是否需要rebuild这个索引,因为可能索引中被删除行过多而造成性能较差(借助deleted_rows列和total_rows)。
Batch Mode Execution是SQL Server 2016的另一大特性,对于900行以上的数据集,除了是INSERT\UPDATE\DELETE这种必须是行模式的,以900为单位批次处理数据集。并非所有的操作符都可以使用Batch Mode,三种join里面也只有hash支持,sort和窗口聚合函数也在SQL Server下支持。
参考:
Columnstore Indexes Versioned Feature Summary
Columnstore Indexes Data Loading
Columnstore Indexes for Data Warehousing
Columnstore Indexes Query Performance
SQL Server ->> ColumnStore Index(列存储索引)的更多相关文章
- SQL Server 2014聚集列存储索引
转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...
- SQL Server 2016 —— 聚集列存储索引的功能增强
作者 Jonathan Allen,译者 邵思华 发布于 2015年6月14日 聚集列存储索引(CC Index)是SQL Server 2014中两大最引 ...
- SQL Server 2014 聚集列存储
SQL Server 自2012以来引入了列存储的概念,至今2016对列存储的支持已经是非常友好了.由于我这边线上环境主要是2014,所以本文是以2014为基础的SQL Server 的列存储的介绍. ...
- SQL SERVER ->> Columnstore Index
谈到Columnstore index就不得不提SQL SERVER的压缩技术了.Columnstore就是用到了SQL SERVER的压缩技术.Columnstore又分Columnstore和Co ...
- SQL Server ->> Online Index Rebuilding(联机索引重建)
SQL Server的Enterprise Edition是支持联机索引重建的.那么联机索引重建是怎么工作的以及对我们的查询有什么影响呢? 既然是联机,SQL Server保持了现有索引对于用户的可用 ...
- 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)
传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...
- SQL Server 列存储索引 第四篇:实时运营数据分析
实时运营数据分析(real-time operational analytics )是指同时在同一张数据表上执行分析处理和业务处理.分析查询主要是对海量数据执行聚合查询,而事务主要是指对数据表进行少量 ...
- 解读SQL Server 2014可更新列存储索引——存储机制
概述 SQL Server 2014被号称是微软数据库的一个革命性版本,其性能的提升的幅度是有史以来之最. 可更新的列存储索引作为SQL Server 2014的一个关键功能之一,在提升数据库的查询性 ...
- SQL Server 2012 列存储索引分析(翻译)
一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...
随机推荐
- SSH使用密钥免密码登录
使用ssh远程连接服务器,有两种身份校验方式:账号密码和秘钥.使用秘钥的方式理论上更加安全,而且免去了输入密码的步骤,使用起来更方便(尤其对于sftp,scp等). 设置 SSH,打开密钥登录功能 编 ...
- sessionKey/tokenKey
移动端维持登录状态的机制 1. sessionKey/tokenKey哪里来? 1. 登录成功之后,后台返回. 2. sessionKey/tokenKey生成有什么规则? 1. 后台返回的,按照一定 ...
- js处理小数方法
1.丢弃小数部分,保留整数部分 js:parseInt(7/2) 2.向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 3,四舍五入. js: Math.round(7/2) 4, ...
- ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...
- SSIS教程:创建简单的ETL包 -- 6. 对项目部署模型使用参数(Using Parameters with the Project Deployment Model)
在本课中,将修改在第 5 课: 添加包部署模型的包配置中创建的包,以便使用项目部署模型.您将使用一个参数替换该配置值,以便指定示例数据位置.还可以复制本教程附带的已完成的 Lesson 5 包. 使用 ...
- 时间格式转换成JUN.13,2017
SimpleDateFormat sdf = new SimpleDateFormat("MMM.dd,yyyy", Locale.ENGLISH); String negotia ...
- 数据集DataSet
ADO.NET数据访问技术的一个突出的特点就是支持离线访问,而实现这种离线访问技术的核心就是DateSet对象,该对象通过将数据驻留在内存来实现离线访问. DataSet对象由一组DataTable对 ...
- Java基础教程(3)--回顾HelloWorld
在上一篇文章中,我们已经编写了第一个Java程序--HelloWorld,并且对它进行了编译和运行.虽然这个例子很短小,但是它具有一个完整的Java程序所应该具有的结构.在这篇文章中,我将会对这个 ...
- 1、类、封装(私有private、this关键字)
类与对象 对象在需求中的使用 对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象. 我们把大象装冰箱为例进行分析. 在针对具体的需求,可以使用名词 ...
- groovy闭包科里化参数
科里化闭包:带有预先绑定形参的闭包.在预先绑定一个形参之后,调用闭包时就不必为这个形参提供实参了.有助于去掉方法调用中的冗余重复. 使用curry方法科里化任意多个参数 使用rcurry方法科里化后面 ...