承接国内外服务器租用托管、定制开发、网站代运营、网站seo优化托管接单、网站代更新,新老站点皆可!!咨询QQ:3787320601

深入学习SQL Server聚合函数算法优化技能

管理员 2023-07-10 10:31:52 互联网圈 8 ℃ 0 评论 7259字 收藏

Sql server聚合函数在实际工作中应对各种需求使用的或者很广泛的,对聚合函数的优化自然也就成了一个重点,一个程序优化的好吗直接决定了这个程序的声明周期。Sql server聚合函数对一组值履行计算并返回单一的值。聚合函数对一组值履行计算,并返回单个值。除 COUNT 之外,聚合函数都会疏忽空值。 聚合函数常常与 SELECT 语句的 GROUP BY 子句一起使用。

一.写在前面

如果有对Sql server聚合函数不熟或忘记了的可以看我之前的一片博客。

本文中所有数据演示都是用Microsoft官方示例数据库:Northwind,至于Northwind大家也能够在网上下载。

二.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)段锁定在索引覆盖范围内

三.Sql server哈希聚合

3.1.概念:

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

哈希聚合的内部实现方法和哈希连接的实现机制一样,需要哈希函数的内部运算,构成区别的哈希值,顺次并行扫描数据构成聚合值。

3.2.背景:

为了解决流聚合的不足,应对大数据的操作,所以哈希聚合就诞生了。

3.3.分析:

来看看两个简单的查询。

ShipCountry和CustomerID的分组查询看上去很类似,但是为何履行计划会区别呢?这是由于ShipCountry包括了大量的重复值,CustomerID重复值非常少,所以Sql server系统给ShipCountry推送的哈希聚合,而CustomerID推送的是流聚合。也就是说Sql server系统会动态的根据查询的情况选择适合的聚合方式。所以我们在做SQL优化的时候不能仅根据SQL语句来优化,还得结合具体数据散布的环境。

四.运算进程监控指标

4.1.监控元素:

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

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

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

4.4.占用内存:

4.5.T-sql语句查询IO:

关于监控元素还有很多,这里就罗列几个。

SQL Server 聚合函数算法优化技能差不多就介绍到这里,希望对大家优化聚合函数算法有所帮助。

文章来源:丸子建站

文章标题:深入学习SQL Server聚合函数算法优化技能

https://www.wanzijz.com/view/62640.html

X

截屏,微信识别二维码

微信号:weimawl

(点击微信号复制,添加好友)

打开微信