SQL Server 聚合函数算法优化技巧

Sql server聚合函数在实际工做中应对各类需求使用的仍是很普遍的,对于聚合函数的优化天然也就成为了一个重点,一个程序优化的好很差直接决定了这个程序的声明周期。Sql server聚合函数对一组值执行计算并返回单一的值。聚合函数对一组值执行计算,并返回单个值。除了 COUNT 之外,聚合函数都会忽略空值。 聚合函数常常与 SELECT 语句的 GROUP BY 子句一块儿使用。html

 

v1.写在前面

若是有对Sql server聚合函数不熟或者忘记了的能够看我以前的一片博客。sql server 基础教程算法

本文中全部数据演示都是用Microsoft官方示例数据库:Northwind,至于Northwind你们也能够在网上下载。至于下载方法MSDN已经有了详细的说明了,这里就很少说了。sql

v2.Sql server标量聚合

2.1.概念: 

在只包含聚合函数的 SELECT 语句列列表中指定的一种聚合函数(如 MIN()、MAX()、COUNT()、SUM() 或 AVG())。当列列表只包含聚合函数时,则结果集只具备一个行给出聚合值,该值由与 WHERE 子句谓词相匹配的源行计算获得。

2.2.探索标量聚合: 

咱们先用Sql server的"包括实际的执行计划"来看看一个简单的流聚合COUNT()来看看表里数据全部的行数。数据库

SQL Server 聚合函数算法优化技巧

再经过SET SHOWPLAN_ALL ON(关于输出中包含的列更多信息能够在连接中查看)来看看有关语句执行状况的详细信息,并估计语句对资源的需求。函数

经过SET SHOWPLAN_ALL ON咱们来看看COUNT()具体作了那些事情:post

  • 索引扫描:扫描当前表的行数
  • 流计算:计算行数的数量
  • 计算标量:将流计算出来的结果转化为适当的类型。(由于索引扫描出来的结果是根据表中数据的大小决定的,若是表中数据不少的话,COUNT是int类型就会有问题,因此在最终返回的时候须要将默认类型(数值通常默认类型是Big)转成int类型。)
  • 小结:经过SET SHOWPLAN_ALL ON咱们能够查看Sql server聚合函数在给咱们呈现最终效果的时候,为这个效果作了些什么事情。
SQL Server 聚合函数算法优化技巧

2.3.标量聚合优化技巧: 

咱们经过两个比较简单的sql查询来看看他们的区别性能

SELECT COUNT(DISTINCT ShipCity) FROM Orders
SELECT COUNT(DISTINCT OrderID) FROM Orders

SQL Server 聚合函数算法优化技巧

从上图中能够看到,其实这两个查询从语句上来讲没什么太大的区别,可是为何开销会不同,一个是查询城市一个是查询订单号。这是由于其实DISTINCT对于OrderID查询来讲,是没有什么意义的,由于OrderID是主键,是不会有重复的。而ShipCity是会有重复的,Sql server的去重机制在去重的时候,会有一个排序的过程。这个排序仍是比较消耗资源的。大数据

对于数据量比较大的表其实不是很建议对大表排序或者对大表的某个重复次数多的字段去重运算。因此咱们这里能够对ShipCity进行优化一下。能够对ShipCity建立一个非汇集索引优化

CREATE INDEX Index_ShipCity On Orders(ShipCity desc)
go

SQL Server 聚合函数算法优化技巧

从上图中能够看到,加了索引之后COUNT(DISTINCT ShipCity)的查询变成了两个流聚合,而没有了排序,节省了开销。url

总结:对于标量聚合从上面的例子你们能够看到,标量聚合优缺点很明显:

  • Sql server标量聚合优势:算法比较简单直观,适合非重复值的聚合操做。
  • Sql server标量聚合缺点:性能较差(须要排序),不适合重复值的聚合操做。

优化技巧:

  • 尽可能避免排序产生
  • 将分组字(GROUP BY)段锁定在索引覆盖范围内

v3.Sql server哈希聚合

3.1.概念: 

哈希(Hash,通常翻译作“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫作预映射, pre-image),经过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间一般远小于输入的空间,不一样的输入可能会散列成相同的输出,因此不可能从散列值来惟一的肯定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。)

哈希聚合的内部实现方法和哈希链接的实现机制同样,须要哈希函数的内部运算,造成不一样的哈希值,依次并行扫描数据造成聚合值。

3.2.背景: 

为了解决流聚合的不足,应对大数据的操做,因此哈希聚合就诞生了。

3.3.分析: 

来看看两个简单的查询。

SQL Server 聚合函数算法优化技巧

ShipCountry和CustomerID的分组查询看上去很相似,可是为何执行计划会不一样呢?这是由于ShipCountry包含了大量的重复值,CustomerID重复值很是少,因此Sql server系统给ShipCountry推送的哈希聚合,而CustomerID推送的是流聚合。也就是说Sql server系统会动态的根据查询的状况选择合适的聚合方式。因此咱们在作SQL优化的时候不能仅根据SQL语句来优化,还得结合具体数据分布的环境。

v4.运算过程监控指标

4.1.监控元素: 

  • 可视化查看运行时间
  • T-sql语句查询时间
  • 占用内存
  • T-sql语句查询IO

4.2.可视化查看运行时间: 

SQL Server 聚合函数算法优化技巧

4.3.T-sql语句查询时间: 

SQL Server 聚合函数算法优化技巧

4.4.占用内存: 

SQL Server 聚合函数算法优化技巧

4.5.T-sql语句查询IO: 

SQL Server 聚合函数算法优化技巧

关于监控元素还有不少,这里就列举几个。

v博客总结

SQL Server 聚合函数算法优化技巧差很少就介绍到这里,若是有对sql语句优化感兴趣的能够看这篇博客。sql server之数据库语句优化

 


做  者:请叫我头头哥
出  处:http://www.cnblogs.com/toutou/
关于做者:专一于基础平台的项目开发。若有问题或建议,请多多赐教!
版权声明:本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文连接。
特此声明:全部评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信
声援博主:若是您以为文章对您有帮助,能够点击文章右下角推荐一下。您的鼓励是做者坚持原创和持续写做的最大动力!

相关文章
相关标签/搜索