浅谈MSSQL2012中的列存储索引(columnstore indexes)
列存储索引为MSSQL2012版本中引进的一个新特性。所有版本MSSQL中标准查询处理模式采用一次一行模型,操作符每次处理一行数据。列存储索引中增加了一种新的基于向量的查询执行功能,通过这种功能,操作符可以一次处理一批(多行)数据。这样,除了可以改善IO性能外,该功能也可以在其他方面带来好处。因为,列存储索引被做了压缩处理,并且,典型数据仓库场景的查询只会用到表列数的10~15%(这样,就可以节省大部分的不必要的磁盘IO)。通过减少数据在操作附件的移动及优化的新处理算法而对性能,批处理数据又可以使查询性能受益。同时,段消除的采用也会使查询性能大大改善。
列存储索引对数据仓库场景具备很大优势,然而,它并打算取代最适合OLTP场景的行存储和处理。查询优化器将自动决定何时用列存储索引,何时用用其他类型的数据存取方式(B-Tree或堆)。查询优化器也将根据具体情况选择处理模式,例如:处理大量数据的查询采用批处理模式,而OLTP业务采用行处理模式。只有当列存储索引可用时,批处理模式才可能被采用。执行计划中也可能既包括批处理模式的操作符,也包括行处理模式的操作符,但成本高的部分应该采用批处理模式,这也可以作为我们排查查询性能问题的一个因素。
以下几个操作符既能运行在行处理模式也能运行在批处理模式:hash join, hash aggregate, project,filter及columnstore index scan。而新操作符 batch hash table build只能运行在批处理模式。批处理操作符需要输入为一批数据行,而行处理模式则要求一行数据。执行计划能包括一组批处理操作符和行处理操作符,但查询处理器将尽力减少它们之间转换的次数,因为批处理模式和行处理模式数据格式间的转换会导致性能问题。包含批处理操作符的执行计划也能利用优化位图过滤,这将会把谓词下推到存储引擎,从而实现尽早将过滤掉无用数据。与B-Tree索引不同,列存储索引没有相关统计数据被收集,优化器将会依据基表的统计数据做出判断。
当系统没有足够的内存或线程可用时,一个执行计划可能会从批处理模式切换到行处理模式,有时,这也可能会导致性能问题。你可以通过查看执行计划及比较评估和实际执行模式或通过扩展事件(batch_hash_table_build_bailout)来进行判断。内存问题是最常见的原因,因为被批处理模式使用的哈希表需要被放到内存中, 如果运行过程中内存不足,MSSQL将会动态的切换回行处理模式。内存不足可能由不精确的基数评估引起,这样,你也许需要确认和更改相关表的统计信息。然而,一个评估的并行执行计划切换回串行可能表示系统线程不足。
列存储索引最明显的劣势,至少在MSSQL2012版本是这样,将来的版本中也许会消失,那就是存在列出存储索引的表不可修改,这可以通过如下三个方法来克服:
1) 删除/重建列存储索引;
2) 用分区切换技术;
3) 用union all语法;
浅谈MSSQL2012中的列存储索引(columnstore indexes)的更多相关文章
- SQL Server 2014聚集列存储索引
转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...
- 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)
传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...
- SQL Server 2012 列存储索引分析(翻译)
一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...
- SQL Server 列存储索引概述
第一次接触ColumnStore是在2017年,数据库环境是SQL Server 2012,Microsoft开始在SQL Server 2012中推广列存储索引,到现在的SQL Server 201 ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 转【】浅谈sql中的in与not in,exists与not exists的区别_
浅谈sql中的in与not in,exists与not exists的区别 1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...
- 浅谈sql中的in与not in,exists与not exists的区别
转 浅谈sql中的in与not in,exists与not exists的区别 12月12日北京OSC源创会 —— 开源技术的年终盛典 » sql exists in 1.in和exists ...
随机推荐
- Gym 100247B Similar Strings(哈希+思维)
https://vjudge.net/problem/Gym-100247B 题意: 如果两个字符串通过映射后是一样的,则说明这两个字符串是相似的,现在给出n个字符串,计算出有多少组字符串是相似的. ...
- 51nod 1437 迈克步(单调栈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1437 题意: 思路: 单调栈题.求出以每个数为区间最大值的区间范围即可. ...
- Spring-JDBC依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</a ...
- Webpack+React项目入门——入门及配置Webpack
一.入门Webpack 参考文章:<入门Webpack,看这篇就够了> 耐心看完这篇非常有帮助 二.React+Webpack环境配置 参考文章:<webpack+react项目初体 ...
- python 传递多个参数
def oper(a,*args): print(args) print(a) oper("q","s","d","z" ...
- Algorithm 算法基础知识(未完成
基础概念不讲,记录课上关键部分 时间复杂度(Time Complexity) 算法所需要花的时间 比较时间复杂度(主要看问题的规模) 时间频度(算法执行次数)T(n)和T(n1),如果两个时间频度为等 ...
- AD10中创建材料清单(BOM表)
材料清单可以用来作为元件的采购清单,同时也可以用于查看PCB中的元件封装信息是否正确. 操作: Reports----->Bill of Materials
- CentOS7 上安装 MySQL 5.7
1.下载如下rpm文件: mysql-community-common-5.7.17-1.el7.x86_64.rpm mysql-community-libs-5.7.17-1.el7.x86_64 ...
- Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...
- eclipse中怎么调出左边项目列表,解决方法:主界面的最上面一栏的Window--ShowView--Project Explorer
主界面的最上面一栏的Window--ShowView--Project Explorer