列存储索引为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. HDU 3401 Trade(斜率优化dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 题意:有一个股市,现在有T天让你炒股,在第i天,买进股票的价格为APi,卖出股票的价格为BPi,同时最多买 ...

  2. MySql查询功能梳理

    CREATE DATABASE CristinMysql Create table employee( eId int(9) not null auto_increment, eName varcha ...

  3. 生成器的使用demo

    定义一个函数: def frange(start, stop, increment): x = start while x < stop: yield x x += increment 使用: ...

  4. sqlserver 中常见的函数字符串函数

    ---字符中操作函数 UPPER(S) 将字符串统一为大写字母 SELECT UPPER('asasA') --ASASA LOWER(S) 将字符串统一为小写字母 SELECT LOWER('asa ...

  5. 正则获取 某段 DIV 中 的内容

    string html = "<div class='aa'><div class='left'>324324<div>dsfsdf</div> ...

  6. [html]自定义滚动条风格

    webkit: <style type="text/css"> *{ margin: 0; padding: 0; } ::-webkit-scrollbar { wi ...

  7. C# 图片人脸识别

    此程序基于 虹软人脸识别进行的开发 前提条件从虹软官网下载获取ArcFace引擎应用开发包,及其对应的激活码(App_id, SDK_key)将获取到的开发包导入到您的应用中 App_id与SDK_k ...

  8. 学习笔记30—Windows那些事

    1.win10编程窗口:powerShell 2.Win7设置工具栏折叠:我们只需要在底部任务栏空白位置点击鼠标右键,然后选择“属性”,在弹出额属性对话框中,将“任务栏按钮”后面的“始终合并.隐藏标签 ...

  9. Mac python 环境配置

    问题:mac 只带了python2.7,要想使用高版本的Python,如python3.x,只能再次安装了,这样就会遇到 两个版本的切换问题了 如下图 : 执行 which python 如下图,查看 ...

  10. Mac 如何安装 chromedriver

    1.使用brew  命令 前提是要安装 brew 这里不做介绍 使用命令 brew install chromedriver 如上图出现错误,根据提示可以使用如下命令安装 brew cask inst ...