性能调优8:分组聚合 - group by
聚合实际上对数据做分组统计,SQL Server使用两种操作符来实现聚合,流聚合(Stream Aggregation)和哈希聚合(Hash aggration)。流聚合是非阻塞性的,具有流的特性,流聚合操作符;边处理数据,边输出聚合的结果。而哈希聚合是阻塞性的,只要处理完所有的数据,才会输出聚合的结果。
一,流聚合
流聚合要求输入的数据集在group by 即分组列上是有序的,也就是说,流聚合需要排序。分组列的位置和顺序不会影响聚合的结果,因此分组列的排序是任意的。对于索引上的流聚合,由于数据是已经排序的,使用流聚合算法没有排序操作的开销。
流聚合算法是:第一个被读取的数据会创建第一个分组,后续读入的数据都会先和当前的分组匹配,如果匹配,把该行放入到当前的分组中;如果不匹配,创建新的分组,直到所有数据行都处理完成为止,最终对各个分组计算聚合值。
二,哈希聚合
在执行计划中,哈希聚合使用的物理操作符是:Hash Match(Aggregate),实际上,Hash Join也是使用Hash Match作为物理操作符。哈希聚合不需要排序,但是需要授予内存来创建Hash表。优化器倾向于使用哈希聚合来对无序的大表进行聚合操作,哈希聚合的算法:
- 对于每一个输入行,在group by列上计算哈希值,
- 检查该行是否映射到hash表中,如果不存在于现有的哈希表,那么把该行插入到哈希表中,创建新的分组;如果存在于现有的哈希表中,把该行插入到现有的分组中。
- 计算哈希表中的数据,作为最终的结果输出。
哈希聚合使用Hash表来存储各个分组的数据,最后并行计算各个分组中的数据。由于数据是无序的,任何数据行都有可能属于任意一个分组,因此,哈希聚合直到处理完所有的数据行才会输出结果。
Hash聚合在创建哈希表时,需要向系统申请授予内存,当授予内存不足时,需要把哈希表的一部分哈希桶溢出到硬盘的workfiles中。这和Hash Join的内存使用和溢出相同。
三,列存储索引
列存储索引适合于数据仓库中,主要执行大容量数据加载和只读查询,与传统面向行的存储方式相比,使用列存储索引存储可最多提高 10 倍查询性能 ,与使用非压缩数据大小相比,可提供多达 7 倍数据压缩率 。列存储索引使用用“批处理执行模式”的模式,这与行存储使用的逐行数据读取模式对比,性能大幅提升。
列存储索引主要在下面三个特性上提升查询的性能:
- 行存储使用逐行处理模式,每次只处理一行数据;而列存储索引使用批处理模式,每次处理一批数据行。
- 行存储是逐行存储(Row Store),每一个Page存储多行数据,而列存储(Column Store)把数据表中的每一列单独存储在Page集合中,这意味着,Page集合中存储的是某一列的数据,而不是一行中所有列的数据。在读取数据时,行存储把一行的所有列都加载到内存,即使有些列根本不会用到;而列存储只把需要的列加载到内存中,不需要的列不会被加载到内存中。
- 列存储索引自动对数据进行压缩处理,由于同一行的数据具有很高的相似性,压缩率很高,数据读取更快速。
一般情况下,数据仓库的查询语句只会查询少数几个列的数据,其他列的数据不需要加载到内存中,这就使得列存储特别适合用于数据仓库中对星型连接(Star- Join)进行聚合查询,所谓星型连接(Star-Join)的聚合查询是指对一个大表(Large Table)和多个小表(Little Table)进行连接,并对Large Table 进行聚合查询。在数据库仓库中,是指事实表和维度表的连接。在大表上创建列存储索引,SQL Server 引擎将充分使用批处理模式(Batch processing mode)来执行星型查询,获取更高的查询性能。
参考文档:
性能调优8:分组聚合 - group by的更多相关文章
- 【翻译】Flink Table Api & SQL — 性能调优 — 流式聚合
本文翻译自官网:Streaming Aggregation https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table ...
- 记一次sql server 性能调优,查询从20秒至2秒
一.需求 需求很简单,就是需要查询一个报表,只有1个表,数据量大约60万左右,但是中间有些逻辑. 先说明一下服务器配置情况:1核CPU.2GB内存.机械硬盘.Sqlserver 2008 R2.Win ...
- Spark性能调优之解决数据倾斜
Spark性能调优之解决数据倾斜 数据倾斜七种解决方案 shuffle的过程最容易引起数据倾斜 1.使用Hive ETL预处理数据 • 方案适用场景:如果导致数据倾斜的是Hive表.如果该Hiv ...
- MySQL性能优化总结___本文乃《MySQL性能调优与架构设计》读书笔记!
一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...
- MySQL性能调优与架构设计——第8章 MySQL数据库Query的优化
第8章 MySQL数据库Query的优化 前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 ...
- Spark性能调优-高级篇
前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问 ...
- SQL Server调优系列基础篇 - 性能调优介绍
前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...
- 性能调优之MYSQL高并发优化
性能调优之MYSQL高并发优化 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之 ...
- [Spark性能调优] 第二章:彻底解密Spark的HashShuffle
本課主題 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 ...
- 性能调优之Mapping
Mapping层级的调优可能会花费时间,但是性能调优的效果确实非常显著的 优化Target,Source之后,可以调优Mapping 通常的方法是尽可能减少组件及组件的字段间不必要的连线 即尽可能用最 ...
随机推荐
- 制作OTA升级包
OTA 软件包工具 本文地址http://wossoneri.github.io/2018/09/21/%5BAndroid%5D%5BFramework%5Dcreate-ota-update-zi ...
- Scrapy代码实战
1.Spider爬虫代码 # -*- coding: utf-8 -*- import scrapy from yszd.items import YszdItem class YszdSpiderS ...
- Visual Studio语言设置
按照的是中文的visual studio,用起来很不方便,因为程序员的都是英文版,平时交流时也是英文的名字 转换语言时发现只有中文和跟随windows系统的设置 官方给的文档看的不是很清楚 查阅资料后 ...
- mssql sqlserver 验证整型函数分享
转自:http://www.maomao365.com/?p=6227 摘要: 下文将制作一个isnumber验证整型的函数,供在sql脚本中做数值判断,如下所示: 例: 实现原理:判断 是否包含特殊 ...
- distribution 分发数据库 灾难恢复 备份恢复
参考: http://www.sqlservercentral.com/articles/Replication/117265/ 前提: 准备一台电脑,主机名和以前的分发数据库一致.并且安装s ...
- ubuntu 安装FoxitReader福昕阅读器(转载)
虽然不怎么用Ubuntu来看文档,但是偶尔还是需要看一下的.而Ubuntu自带的打开PDF的软件真的看着很难受,装一个跨平台的福昕好了. 首先,下载.可以官网下载:福昕官网 不过晚上不知道网络抽风还是 ...
- June 5. 2018 Week 23rd Tuesday
Learn to let go and be clear of where you really want to head for. 学会放手,同时也要弄清楚自己的真正所爱. From Kissing ...
- beta版本合集
beta版本合集 [<p><span style="text-align: center; padding-bottom: 6px; background-color: # ...
- Sublime 汉化、快捷键打开浏览器
Sublime 是一个优秀的代码编译工具,它具有漂亮的用户界面和强大的功能,例如代码缩略图,Python 的插件,代码段等.不仅如此,它还可自定义按键绑定,菜单和工具栏.由于是歪果仁开发的,所以官方版 ...
- 【大数据技术】HBase介绍
1.HBase简介1.1 Hbase是什么HBase是一种构建在HDFS之上的分布式.面向列.多版本.非关系型的数据库,是Google Bigtable 的开源实现. 在需要实时读写.随机访问超大规模 ...