列存储索引为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. 1月4日笔记 vi编辑器

      Penn   vi编辑器,全称是visual interface,可以执行输出.删除.查找.替换等众多的文本操作. vi并不是一个排版程序,不可以对字体.格式.段落等其他的属性进行编排. vi是全 ...

  2. 把一个List拆分为几个大小一样的List

    static void Main(string[] args) { List<String> tarArr = new List<String>(); tarArr.Add(& ...

  3. _equipment

    该表控制切换地图自动更换装备,离开该地图时,装备自动切换为原来.,HEAD - TABARD小于0时取下装备,等于0时不更换,大于0时更换为对应装备. comment 备注 class 职业索引 1- ...

  4. _itemmod_exchange_item

    物品强化说明 表说明 `item`物品ID `exchangedItem` 升级后的物品ID `upFlag` 物品等级模式0或1,一般为0 `reqId` 需求ID `chance` 升级几率 `c ...

  5. 小tip: margin:auto实现绝对定位元素的水平垂直居中

    转载自:http://www.zhangxinxu.com/wordpress/?p=3794 一.绝对定位元素的居中实现 如果要问如何CSS实现绝对定位元素的居中效果,很多人心里已经有答案了. 兼容 ...

  6. CentOS7 下更改源

    在CentOS 7下更改yum源与更新系统. [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo cp /etc/yum.repos.d/CentOS-Base.rep ...

  7. DataGrip激活码

    引言: 网上有有很多datagirp的激活码,但是经过尝试很多都失效了,找了半天终于 找到了一个可用的激活码! 1. 激活码 适用版本: DataGrip2018.2.3,2018.1.1,其他版本没 ...

  8. Python open操作文件

    操作文件 # coding=utf-8 支持中文 """ China Japan France England """ f = open(& ...

  9. AD绘制PCB时,贴片封装器件的焊盘间距小于10Mil,报错解决

    Design->Rules->Manufacturing->Minimum Solder Mask Sliver

  10. Study之2 Glance相关操作-devstack

    1,Glance的image是存储在backend中,backend配置在: /etc/glance/glance-api.conf.2, devstack默认:image 存放在控制节点本地目录 / ...