SQL Server 聚合函数算法优化技巧
博客前言
Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期。Sql server聚合函数对一组值执行计算并返回单一的值。聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。
1.写在前面
本文中所有数据演示都是用Microsoft官方示例数据库:Northwind,至于Northwind大家也可以在网上下载。至于下载方法MSDN已经有了详细的说明了,这里就不多说了。
2.Sql server标量聚合
2.1.概念:
在只包含聚合函数的 SELECT 语句列列表中指定的一种聚合函数(如 MIN()、MAX()、COUNT()、SUM() 或 AVG())。当列列表只包含聚合函数时,则结果集只具有一个行给出聚合值,该值由与 WHERE 子句谓词相匹配的源行计算得到。
2.2.探索标量聚合:
我们先用Sql server的”包括实际的执行计划”来看看一个简单的流聚合COUNT()来看看表里数据所有的行数。
再通过SET SHOWPLAN_ALL ON来看看有关语句执行情况的详细信息,并估计语句对资源的需求。
通过SET SHOWPLAN_ALL ON我们来看看COUNT()具体做了那些事情:
索引扫描:扫描当前表的行数
流计算:计算行数的数量
计算标量:将流计算出来的结果转化为适当的类型。(因为索引扫描出来的结果是根据表中数据的大小决定的,如果表中数据很多的话,COUNT是int类型就会有问题,所以在最终返回的时候需要将默认类型(数值一般默认类型是Big)转成int类型。)
小结:通过SET SHOWPLAN_ALL ON我们可以查看Sql server聚合函数在给我们呈现最终效果的时候,为这个效果做了些什么事情。
2.3.标量聚合优化技巧:
我们通过两个比较简单的sql查询来看看他们的区别
SELECT COUNT(DISTINCT ShipCity) FROM OrdersSELECT COUNT(DISTINCT OrderID) FROM Orders
从上图中可以看到,其实这两个查询从语句上来说没什么太大的区别,但是为什么开销会不一样,一个是查询城市一个是查询订单号。这是因为其实DISTINCT对于OrderID查询来说,是没有什么意义的,因为OrderID是主键,是不会有重复的。而ShipCity是会有重复的,Sql server的去重机制在去重的时候,会有一个排序的过程。这个排序还是比较消耗资源的。
对于数据量比较大的表其实不是很建议对大表排序或者对大表的某个重复次数多的字段去重运算。所以我们这里可以对ShipCity进行优化一下。可以对ShipCity创建一个非聚集索引。
CREATE INDEX Index_ShipCity On Orders(ShipCity desc)go
从上图中可以看到,加了索引以后COUNT(DISTINCT ShipCity)的查询变成了两个流聚合,而没有了排序,节省了开销。
总结:对于标量聚合从上面的例子大家可以看到,标量聚合优缺点很明显:
Sql server标量聚合优点:算法比较简单直观,适合非重复值的聚合操作。
Sql server标量聚合缺点:性能较差(需要排序),不适合重复值的聚合操作。
优化技巧:
尽量避免排序产生
将分组字(GROUP BY)段锁定在索引覆盖范围内
3.Sql server哈希聚合
3.1.概念:
哈希(Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。)
哈希聚合的内部实现方法和哈希连接的实现机制一样,需要哈希函数的内部运算,形成不同的哈希值,依次并行扫描数据形成聚合值。
3.2.背景:
为了解决流聚合的不足,应对大数据的操作,所以哈希聚合就诞生了。
3.3.分析:
来看看两个简单的查询。
ShipCountry和CustomerID的分组查询看上去很类似,但是为什么执行计划会不同呢?这是因为ShipCountry包含了大量的重复值,CustomerID重复值非常少,所以Sql server系统给ShipCountry推送的哈希聚合,而CustomerID推送的是流聚合。也就是说Sql server系统会动态的根据查询的情况选择合适的聚合方式。所以我们在做SQL优化的时候不能仅根据SQL语句来优化,还得结合具体数据分布的环境。
4.运算过程监控指标
4.1.监控元素:
可视化查看运行时间
T-sql语句查询时间
占用内存
T-sql语句查询IO
4.2.可视化查看运行时间:
4.3.T-sql语句查询时间:
4.4.占用内存:
4.5.T-sql语句查询IO:
关于监控元素还有很多,这里就列举几个。
博客总结
SQL Server 聚合函数算法优化技巧差不多就介绍到这里,如果有对sql语句优化感兴趣的可以看这篇博客。sql server之数据库语句优化
转载于:https://www.cnblogs.com/firstdream/p/7528279.html
SQL Server 聚合函数算法优化技巧相关推荐
- SQL Server 聚合函数
在数据库中有大量的数据,如果统计起来会较为麻烦,比如统计某数据的平均值或者总数值,但是在SQL Server中有聚合函数可以使用,聚合函数会对一个组进行运算然后返回计算的结果,通常和GROUP BY子 ...
- 妙用SQL Server聚合函数和子查询迭代求和
本文为原创,如需转载,请注明作者和出处,谢谢! 先看看下面的表和其中的数据: t_product 图1 该表有两个字段:xh和price, 其中xh是主索引字段,现在要得到如下的查询结果: 图2 从上 ...
- 阿里云PyODPS 0.7.18发布,针对聚合函数进行优化同时新增对Python 3.7支持
近日,阿里云发布PyODPS 0.7.18,主要是针对聚合函数进行优化同时新增对Python 3.7支持. PyODPS是MaxCompute的Python版本的SDK,SDK的意思非常广泛,辅助开发 ...
- 在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好。
在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好. SQL Server2005扩展函数已经不是一件什么新鲜的事了,但是我看网上的大部分都是说聚合函数,例子也比较浅,那么这里 ...
- SQL Server 数据库的整理优化的基本过程(二)
SQL Server 数据库的整理优化的基本过程(二) 高建刚 第一节 基本维护 第二节 索引 索引相信大家都不陌生,而且在因特网上,有了很多关于如何通过索引来优化数据库的文章,在这里,我主要是结合我 ...
- SQL Server日期函数集合
SQL Server日期函数集合--1:获取系统日期和时间值函数 --getdate() SELECT GETDATE() AS 'today' --getutcdate() SELECT GETUT ...
- sql server数据库性能的优化
编者按:数据库性能优化和数据库管理系统密切相关,不同的数据库管理系统在具体操作上有很大不同.继本报连续在2003年第48期.49期上刊登<sybase数据库性能调优>和<oracle ...
- tidb和tbase的聚合函数算法
tidb的聚合函数算法 连接:(二十二)Hash Aggregation tidb实现了两种聚合函数的算法:Hash Aggregation 和 Stream Aggregation 对于数据无序的, ...
- sql中聚合函数和分组函数_学习SQL:聚合函数
sql中聚合函数和分组函数 SQL has many cool features and aggregate functions are definitely one of these feature ...
- 目标检测算法优化技巧
论文:Bag of Freebies for Training Object Detection Neural Networks 论文链接:https://arxiv.org/abs/1902.041 ...
最新文章
- DTD – XML 构建模块概述
- 网站优化充满机遇和挑战
- UML静态建模之用例图
- 简单爬虫-爬取免费代理ip
- 《剑指offer》替换空格
- js实现html模板继承,理解JavaScript中的原型和继承
- Java 编写推箱子报告_Java推箱子怎么写啊?
- 云小课|打造企业数据“高内聚,低耦合”--试试GaussDB(DWS)逻辑集群,实现数据物理隔离
- 基于SSM框架的高校实验室管理系统PPT模板
- linux centos 系统php支持jpeg的安装方法
- 19.docker attach
- 2020-08-24 每日一句
- paip.java 开发中web server的选择jboss resin tomcat比较..
- 云风:游戏数值公式的表象与本质
- Oracle JDK收费理解
- servlet生命周期 1
- Linux查看服务器配置
- Lodop云打印控件使用
- RSA算法进行加密和解密
- 高仿优酷Android客户端图片左右滑动(自动切换)
热门文章
- java静态和动态的区别是什么_java中静态资源和动态资源的区别
- python安装换源_Python切换pip安装源的方法详解
- latex table 表格中 文字对齐
- linux cpu 个数、核心数、线程数
- 解决excel导出大数字溢出或者被科学计数法格式化
- hadoop 如何连beeline_impala为hadoop续命
- linux流量监控php_Linux下安装vnstat流量统计,流量监控
- java 父类中的this_父类方法中的this
- hibernate 基础方法(一)及Hibernate中java对象的三种状态
- 八、Linux文本编辑器vim/vi