原文地址:http://social.technet.microsoft.com/wiki/contents/articles/4995.sql-server-columnstore-performance-tuning.aspx

SQL Server 的列存储索引是SQL Server 2012 release版本新增的内容,用于提高数据仓库的查询性能,本篇文章阐述列存储的性能调优。

  列存储索引性能的基本原则

  在相同的硬盘和数据量时,列存储能够明显提高部分查询的速度。致使列存储查询效率高的因素有以下几点:

  1.  列存储索引采用高度压缩的形式来存储数据,并且每一列都存储到不同的页分组上。由于数据仓库中的大部分表包含30列以上,但是一般的查询可能只需要5、6列,并且仅查询展示的列需要从磁盘中读取,这样,采用列存储会大大的减少数据仓库的查询I/O。对于查询频繁的列在内存中会进行缓存,包含数据备份的聚集B-树或堆经常用来构建列索引和执行大部分的查询。在查询的周期内,他会定期的释放内存空间和资源。

2.  批处理 是一种更高效、基于矢量查询并且运用列存储索引的方法。一批是包含1000行的一个集合。相比于基于行的旧查询方式,批处理能够降低7%-40%的cup消耗。有效的矢量运算允许批处理降低基本过滤、表达式预估、执行计划、联合查询的CPU花费。

3.  块分割能够跳过大部分数据来加快数据扫描。在列存储索引里的每一部分达到1000行会单独分割成一块,每一块都有存储着该块内每一列最大值、最小值的元数据。存储引擎通过元数据来检测过滤条件。如果引擎检测到块内没有符合要求的数据,那么它会跳过该块数据,并且这块数据不会进行磁盘的读写。

4.  存储引擎能够在查询之前去除部分数据,这样能够提高查询的响应速度。

SQL Server 已经完善了列存储索引和批处理查询这种模式。一个部分查询可以执行为一个批处理查询模式,一个标准行查询模式或者一个混合了批处理和标准行查询模式。获取最佳性能的关键是确认查询流程的大部分数据是在批处理模式。即使大批的查询不能在批处理模式下执行,使用列存储索引也能通过减少磁盘I/O,存储引擎的预过滤来获得重要的性能提升。

  通过界面上的【显示执行计划】,将鼠标放到消耗昂贵的扫描操作上,查看提示。它会显示预估和实际执行模式是行模式或者批处理模式。

  什么情况下使用列存储索引

  1.  将列存储索引仅应用到大数据量的表上。应将列存储索引创建在数据仓库的实际花费表上,而不是一个定义表。如果你有一个包含至少百万级的数据量的定义表,那么也可以考虑将列存储索引应用到这个定义表上。

2. 用列存储索引包含表的每一列。如果不这样做,查询不在列存储索引中的列将不会享受列存储索引带来的效率。

3. 结构化查询,避免关联两个或更多个大表,通过一个大的实际花费表关联多个小的定义表来提高效率。

 什么情况下不建议使用列存储索引

     1. 避免直接的在列存储索引的列上进行字符串过滤和通过字符串列进行表的关联。对字符串过滤不能使用列索引进行扫面,关联字段为字符串不如使用数值类型关联更有效率。对数值类型和时间类型的过滤都可以使用列存储索引进行扫描,在实际环境的大表中可以考虑使用整形的编码来代替字符串类型,并将字符串类型转移到一个小的定义表,通过整形编码进行关联,这样查询效率会更高。

2. 避免在列存储索引的列上使用外连接(out join),外连接不能应用查询的批量处理,相反的,是通过低版本的行查询进行处理。

3. 避免在列存储索引的列上使用不包含语句(not in),原因同第2条。

4. 避免在列存储索引的列上使用Union All语句来关联其他表。原因同上。

对于以上不建议使用列存储索引的情况,可以通过SQL Server的CTE语句(with....as ) 来进行解决,这样可以是查询使用批量处理的引擎进行处理。

详细解释请查看 :http://social.technet.microsoft.com/wiki/contents/articles/5022.use-outer-join-with-columnstores-and-still-get-the-benefit-of-batch-processing.aspx

  http://social.technet.microsoft.com/wiki/contents/articles/5123.perform-not-in-and-still-get-the-benefit-of-batch-processing.aspx

http://social.technet.microsoft.com/wiki/contents/articles/5226.perform-union-all-and-still-get-the-benefit-of-batch-processing.aspx

由于英语能力有限,翻译的语句可能存在歧义,如不理解,请阅读原文。

SQL Server 列存储性能调优(翻译)的更多相关文章

  1. SQL Server 列存储索引强化

    SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...

  2. 使用Spark加载数据到SQL Server列存储表

    原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...

  3. Spark SQL概念学习系列之性能调优

    不多说,直接上干货! 性能调优 Caching Data In Memory Spark SQL可以通过调用sqlContext.cacheTable("tableName") 或 ...

  4. SQL Server 列存储索引概述

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

  5. SQL Server 列存储索引 第二篇:设计

    列存储索引可以是聚集的,也可以是非聚集的,用户可以在表上创建聚集的列存储索引(Clustered Columnstore Index)或非聚集的列存储索引(Nonclustered Columnsto ...

  6. SQL Server 列存储索引 第三篇:维护

    列存储索引分为两种类型:聚集的列存储索引和非聚集的列存储索引,在一个表上只能创建一个聚集索引,要么是聚集的列存储索引,要么是聚集的行存储索引,然而一个表上可以创建多个非聚集索引. 一,创建列存储索引 ...

  7. SQL Server 列存储索引 第四篇:实时运营数据分析

    实时运营数据分析(real-time operational analytics )是指同时在同一张数据表上执行分析处理和业务处理.分析查询主要是对海量数据执行聚合查询,而事务主要是指对数据表进行少量 ...

  8. IBM DS存储存储性能调优

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jaminwm/article/details/26458791 ibm存储适用,其它存储有相似參数. ...

  9. 在SQL Server 2016里使用查询存储进行性能调优

    作为一个DBA,排除SQL Server问题是我们的职责之一,每个月都有很多人给我们带来各种不能解释却要解决的性能问题. 我就多次听到,以前的SQL Server的性能问题都还好且在正常范围内,但现在 ...

随机推荐

  1. C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)-来自转载收集

    using System; using System.IO; using System.Text; /// <summary> /// FileEncoding 的摘要说明 /// < ...

  2. webservice wsdl axis2报错 Provider com.bea.xml.stream.MXParserFactory not found

    错误信息: Exception in thread "main" javax.xml.stream.FactoryConfigurationError: Provider com. ...

  3. awk 命令

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  4. C#操作access数据库

    未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法 去http://download.microsoft.com/download/7/0/3/703ffbcb- ...

  5. (分享)Paxos在大型系统中常见的应用场景

    原帖http://timyang.net/distributed/paxos-scenarios/ 在分布式算法领域,有个非常重要的算法叫Paxos, 它的重要性有多高呢,Google的Chubby ...

  6. vsftp 根据用户设置

    #vsftpd.conf ###############pam_service_name=vsftpduserlist_enable=YEStcp_wrappers=YESlocal_root=/da ...

  7. vs默认VS Development Sever和用IIS Web Server的一点差别

    关于VS Development Server(vs调试默认运行环境)和IIS Web Server 做运行服务器时,请求处理的一点区别. 将请求粗略分为两类:静态资源请求和动态资源请求. 静态资源请 ...

  8. RegExp对象

    RegExp()构造函数带有两个字符串参数,其中第二个是可选的,如果提供第二个参数,它就指定正则表达式的修饰符.第一个函数包含正则表达式的主题部分,也就是正则表达式直接量中两条斜线之间的文本.无论是字 ...

  9. C#中Invoke 和 BeginInvoke 的区别

    Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句 ...

  10. pdo 事物的处理