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

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

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

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

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

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

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

  4. SQL Server 列存储索引概述

    第一次接触ColumnStore是在2017年,数据库环境是SQL Server 2012,Microsoft开始在SQL Server 2012中推广列存储索引,到现在的SQL Server 201 ...

  5. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  6. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  7. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  8. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  9. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

随机推荐

  1. JavaScript深入

    BOM(浏览器对象模型)——与浏览器对话: Window对象(代表浏览器的窗口——不包括工具栏.滚动条): //所有全局对象.全局函数,均自动成为window对象的成员(document属于浏览器,所 ...

  2. 针对list集合进行分页展示

    直接定义个工具类,代码如下: package com.jk51.modules.wechat.web.util; import java.util.Collections; import java.u ...

  3. Chrome,你这坑人的默认非安全端口

    今天用chrome打开页面的发现一个错误: ERR_UNSAFE_PORT 字面意思是error:不安全端口. 一.什么是默认非安全端口?    每个浏览器出于安全问题,都会禁止一些网络浏览以外的端口 ...

  4. Educational Codeforces Round 23 C. Really Big Numbers 暴力

    C. Really Big Numbers time limit per test 1 second memory limit per test 256 megabytes input standar ...

  5. 七牛云存储上传自有证书开启https访问

    虽然七牛云存储也提供免费SSL证书申请,但我就喜欢用其他平台申请的,于是在腾讯云申请了免费SSL证书,正准备在七牛上传,弹出的界面却让我傻了眼,如下图所示: 腾讯免费SSL证书提供了不同服务器环境的版 ...

  6. 关于System.in如何执行的问题

    import java.io.IOException; public class Test1 { public static void main(String[] args) throws IOExc ...

  7. hadoop中 bin/hadoop fs -ls ls: `.': No such file or directory问题

    2.x版本上的使用bin/hadoop fs -ls  /就有用 应该使用绝对路径就不会有问题 mkdir也是一样的 原因:-ls默认目录是在hdfs文件系统的/user/用户名(用户名就命令行@符号 ...

  8. R语言 平滑连接

    参考自 153分钟 使用平滑曲线,沿着X轴从左向右的顺序依次连接,可以使用spline样条函数线. x = 1:5 y = c(1,3,4,2.5,2) plot(x,y) sp = spline(x ...

  9. 第 2 章 容器架构 - 008 - Docker 组件如何协作?

    容器启动过程如下: Docker 客户端执行 docker run 命令. Docker daemon 发现本地没有 httpd 镜像. daemon 从 Docker Hub 下载镜像. 下载完成, ...

  10. legend2---开发日志1(legend的数据库整体设计思路是什么)

    legend2---开发日志1(legend的数据库整体设计思路是什么) 一.总结 一句话总结:不同种类的物品分不同的表放,不放到一个物品表里,取所有物品时一个个表的取就好了 不同种类的物品分不同的表 ...