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

58次阅读
没有评论

共计 2272 个字符,预计需要花费 6 分钟才能阅读完成。

今天就跟大家聊聊有关 SQL Server 聚合函数算法优化技巧是什么,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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

一. 写在前面

所有数据演示都是用 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 聚合函数算法优化技巧是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-18发表,共计2272字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)