SQL Server ->> ColumnStore Index(列存储索引)

时间:2021-08-04 06:09:22

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类似的技术快速插入数据到目标表。

SQL Server ->> ColumnStore Index(列存储索引)

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(列存储索引)的更多相关文章

  1. SQL Server 2014聚集列存储索引

    转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...

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

    作者 Jonathan Allen,译者         邵思华         发布于     2015年6月14日   聚集列存储索引(CC Index)是SQL Server 2014中两大最引 ...

  3. SQL Server 2014 聚集列存储

    SQL Server 自2012以来引入了列存储的概念,至今2016对列存储的支持已经是非常友好了.由于我这边线上环境主要是2014,所以本文是以2014为基础的SQL Server 的列存储的介绍. ...

  4. SQL SERVER -&gt&semi;&gt&semi; Columnstore Index

    谈到Columnstore index就不得不提SQL SERVER的压缩技术了.Columnstore就是用到了SQL SERVER的压缩技术.Columnstore又分Columnstore和Co ...

  5. SQL Server -&gt&semi;&gt&semi; Online Index Rebuilding&lpar;联机索引重建&rpar;

    SQL Server的Enterprise Edition是支持联机索引重建的.那么联机索引重建是怎么工作的以及对我们的查询有什么影响呢? 既然是联机,SQL Server保持了现有索引对于用户的可用 ...

  6. 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)

    传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...

  7. SQL Server 列存储索引 第四篇:实时运营数据分析

    实时运营数据分析(real-time operational analytics )是指同时在同一张数据表上执行分析处理和业务处理.分析查询主要是对海量数据执行聚合查询,而事务主要是指对数据表进行少量 ...

  8. 解读SQL Server 2014可更新列存储索引——存储机制

    概述 SQL Server 2014被号称是微软数据库的一个革命性版本,其性能的提升的幅度是有史以来之最. 可更新的列存储索引作为SQL Server 2014的一个关键功能之一,在提升数据库的查询性 ...

  9. SQL Server 2012 列存储索引分析(翻译)

    一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...

随机推荐

  1. android AsyncTask实例

    .java package com.example.activitydemoay; import android.app.Activity; import android.content.Intent ...

  2. oracle中一些用法总结

    1. case用法: --简单case函数 case sex when '1' then 'boy' when '2' then 'girl' else '其他' end; --case搜索函数 ca ...

  3. JSONP理解和使用

    一.代码使用: $.ajax({ async:false, url: http://跨域的dns, type: "GET", dataType: 'jsonp'}); 二.理解: ...

  4. &lbrack;BS&rsqb; 小知识点总结-03

    1.Autolayout中“constrain to margins” Autolayout中的页面边距的问题ios8以后的UIView增加了layoutMargins属性,在Storyboard/I ...

  5. 模拟实现STL中的list

    #pragma once #include<iostream>using namespace std;#include<assert.h> template<class ...

  6. 非常出色的一款WinForm窗体重绘GUI类库源码

    基本控件的演示 ScrollBar滚动条 各种圆形进度条 ProgressBar进度条 Mdi演示,仿谷歌浏览器 多种皮肤可供选择 一套专业级别的GUI控件,目前包含了窗体.进度条.滚动条以及MDI多 ...

  7. navicat for mysql &lpar;10038&rpar;如何解决&comma;远程无法连接问题

    ubuntu server下安装了MySQL 5.5数据库,然后在windows下通过Navicat for MySQL连接时,出现 Can't connect to mysql server on ...

  8. MessageFormat&period;format 包含单引号引起的不可替换

    MessageFormat.format("region = '{0}'", "en");实际结果是region = {0}如果需要被替换的话,需要用双单引号 ...

  9. &lbrack;CQOI2017&rsqb;老C的键盘

    [CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...

  10. 【BZOJ3821&sol;UOJ46】玄学(二进制分组,线段树)

    [BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...