浅谈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 ...
随机推荐
- 批量Excel数据导入Oracle数据库 导入excel错误:外部表不是预期的格式 解决方案
在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一下,导出的Excel是标准文件不是html,没错 ...
- php CLI SAPI 内置Web Server
PHP 5.4.0起, CLI SAPI 提供了一个内置的Web服务器. 这个内置的Web服务器主要用于本地开发使用,不可用于线上产品环境. URI请求会被发送到PHP所在的的工作目录(Working ...
- Qt532.线程(_beginthread)
1.(20180928)环境:Win7x64.Qt5.3.2 MSVC2010 OpenGL.ms2010 2.测试代码: ZC:我记得 之前在 VC6.vs08 上,还要选择 使用的是哪种 运行时线 ...
- Android AndFix修复方式的限制
这里阅览了很多网上关于修复的资料,一一贴在这里便于查看: https://github.com/alibaba/AndFix 这是官方处 要了解使用,一定得看看这里. http://www.jia ...
- MySQL学习(十六)
MySQL高级部分 触发器 触发器是一类特殊的事务,可以监视某种数据操作(insert/update/delete),并触发相关的操作(insert/update/delete) 触发器创建语法之4要 ...
- Xcode打包上传遇到的坑
1.安装测试包的时候提示APIInternalError ①是否增加了测试设备的UUID ②是否使用adhoc证书打包 2.打包错误:error: couldn't remove '/Users/xx ...
- css的table布局
1.table中对tr设置margin-top是没有作用的.
- Notepad++安装json插件
安装 : 1.下载插件压缩包并解压出dll:NPPJSONViewer.dll(64位) 下载地址:https://pan.baidu.com/s/1JeBzrovb-GHRo14vO-AnJA 提 ...
- TP3.2.3框架与已有模板做结合
具体实现步骤: a. 复制模板文件到View指定目录 b. 复制到css.img.js静态资源文件到系统指定目录 c. 把静态资源(css.img.js)文件的路径设置为"常量" ...
- RHEL 5 , 用安装CD作为YUM的Repository
官方文档写的非常好 14.5. Upgrading the System Off-line with ISO and Yum Create a target directory to mount yo ...