SQL Server 列存储性能调优(翻译)
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 ) 来进行解决,这样可以是查询使用批量处理的引擎进行处理。
由于英语能力有限,翻译的语句可能存在歧义,如不理解,请阅读原文。
SQL Server 列存储性能调优(翻译)的更多相关文章
- SQL Server 列存储索引强化
SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...
- 使用Spark加载数据到SQL Server列存储表
原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...
- Spark SQL概念学习系列之性能调优
不多说,直接上干货! 性能调优 Caching Data In Memory Spark SQL可以通过调用sqlContext.cacheTable("tableName") 或 ...
- SQL Server 列存储索引概述
第一次接触ColumnStore是在2017年,数据库环境是SQL Server 2012,Microsoft开始在SQL Server 2012中推广列存储索引,到现在的SQL Server 201 ...
- SQL Server 列存储索引 第二篇:设计
列存储索引可以是聚集的,也可以是非聚集的,用户可以在表上创建聚集的列存储索引(Clustered Columnstore Index)或非聚集的列存储索引(Nonclustered Columnsto ...
- SQL Server 列存储索引 第三篇:维护
列存储索引分为两种类型:聚集的列存储索引和非聚集的列存储索引,在一个表上只能创建一个聚集索引,要么是聚集的列存储索引,要么是聚集的行存储索引,然而一个表上可以创建多个非聚集索引. 一,创建列存储索引 ...
- SQL Server 列存储索引 第四篇:实时运营数据分析
实时运营数据分析(real-time operational analytics )是指同时在同一张数据表上执行分析处理和业务处理.分析查询主要是对海量数据执行聚合查询,而事务主要是指对数据表进行少量 ...
- IBM DS存储存储性能调优
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jaminwm/article/details/26458791 ibm存储适用,其它存储有相似參数. ...
- 在SQL Server 2016里使用查询存储进行性能调优
作为一个DBA,排除SQL Server问题是我们的职责之一,每个月都有很多人给我们带来各种不能解释却要解决的性能问题. 我就多次听到,以前的SQL Server的性能问题都还好且在正常范围内,但现在 ...
随机推荐
- webpack使用笔记
webpack简介 CommonJS和AMD是用于JavaScript模块管理的两大规范,前者定义的是模块的同步加载,主要用于NodeJS:而后者则是异步加载,通过requirejs等适用于前端.np ...
- NK3C:异常处理(前端)
前端的提示有些也不是很规范,主要体现如下: 1.ResultInfo的返回值,false的情况下,未做处理: 2.ResultInfo的返回值,false的情况下,做了其他操作,未提示错误:(虽然没报 ...
- Openwebrtc
https://github.com/EricssonResearch ============================= webrtc系列不错的博客 http://blog.csdn.net ...
- Host基本概念
TSO TSO是Time Sharing Option的缩写,是MVS的命令输入处理器. TSO是在操作系统的管理下,用来支持ISPF菜单式会话系统和资源管理设备( ...
- maven更新远程仓库速度太慢解决方法
1.maven在更新下载jar包的时候,因为jar包默认是从国外服务器上下载的,所以速度特别慢 2.通过设置镜像的方法加快jar包下载 3.在maven安装目录下,/config/settings.x ...
- iOS 数据序列化,NSCoding, NSCoder
iOS可以利用NSKeyedArchiver类将对象序列化成NSData存储在磁盘上,但前提是该对象所属的类必须遵从NSCoding协议. NSCoding协议包含两个方法,要序列化的类必须实现它们 ...
- 如何用grunt压缩文件
grunt-cli 全局装完之后,就可以给每个项目装grunt了. 1.先把package.json和Gruntfile.js拷到项目下(PS:这两个文件是每个项目装grunt的时候必带的) 2. ...
- php用simplexml来操作xml
<?php$username = 'zhansan';if (!file_exists('001.xml')){ $fp = fopen('001.xml', 'w'); $xmlContent ...
- DNS初识
/注释----本文大部分内容来自网络/ 一.定义: DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库, ...
- 文本换行word-wrap、word-break与white-space
本文同步至微信公众号:http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=401671055&idx=1&sn=b88c9 ...