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的性能问题都还好且在正常范围内,但现在 ...
随机推荐
- 定制centos安装iso
参考 https://gist.github.com/pauljeff/4b9ad551cb6c35870d7c https://www.redhat.com/archives/kickstart-l ...
- C# 软件绑定QQ群类开源放出
周天闲来无事写个公共类,可以添加到你们自己项目中限制必须加入你QQ群才可以使用. 代码简单,高手勿喷,有哪里不合理的请回帖让大家学习学习. using System; using System.Tex ...
- 一键安装lamp环境 centos
linux centos yum安装LAMP环境 /*************链接**************/http://www.cnblogs.com/suger/p/3832093.html ...
- MS - 1 - 把二元查找树转变成排序的双向链表
## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10 ...
- (分享)Paxos在大型系统中常见的应用场景
原帖http://timyang.net/distributed/paxos-scenarios/ 在分布式算法领域,有个非常重要的算法叫Paxos, 它的重要性有多高呢,Google的Chubby ...
- Programming Entity Framework 翻译(2)-目录2-章节
How This Book Is Organized 本书组织结构 Programming Entity Framework, Second Edition, focuses on two ways ...
- XidianOJ 1149 卡尔的技能 II
--正文 多重集合数 + 组合数取模 首先求出没有限制的选择方法C(n+m-1,m) 然后减掉至少有一个元素选择了k+1次的方法数,加上至少有两个元素选择了k+1次的方法数...以此类推 然后是组合数 ...
- php限定时间内同一ip只能访问一次
建立一个数据表 CREATE TABLE `clicks` ( `ip` INT UNSIGNED NOT NULL , `time1` INT UNSIGNED NOT NULL , `time2` ...
- sublime 关闭自动更新
第一步: 点击菜单栏“Preferences”=> "Settings-User" 进入个人参数设置页面: 第二步: 在大括号内插入如下代码:"update_che ...
- Android_SQLite版本升级,降级 管理
今天我们主要学习了数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0 ...