当前位置: 首页 > 编程笔记 >

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

严修诚
2023-03-14
本文向大家介绍深入学习SQL Server聚合函数算法优化技巧,包括了深入学习SQL Server聚合函数算法优化技巧的使用技巧和注意事项,需要的朋友参考一下

Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期。Sql server聚合函数对一组值执行计算并返回单一的值。聚合函数对一组值html" target="_blank">执行计算,并返回单个值。除了 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 聚合函数算法优化技巧差不多就介绍到这里,希望对大家优化聚合函数算法有所帮助。

 类似资料:
  • 本节将讨论优化与深度学习的关系,以及优化在深度学习中的挑战。在一个深度学习问题中,我们通常会预先定义一个损失函数。有了损失函数以后,我们就可以使用优化算法试图将其最小化。在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function)。依据惯例,优化算法通常只考虑最小化目标函数。其实,任何最大化问题都可以很容易地转化为最小化问题,只需令目标函数的相反数为新的目标函数即可

  • 假设给你一个数字,N,这是你的目标数字。然后给你一系列p个数,你必须找到这些数中大于N的最小和,也就是说,它最小地超过了N(或者等于N)。 你可以取任意元素组合的任意和。p可以大到100。 我目前的算法:在扫描所有信息后,我创建了一个100位长的位集,并通过使用循环将从0到(2^p)-1的所有整数转换为它,有效地结束了000…000和111…111之间的所有二进制数。 如您所知,这些向量可以被解释

  • 职位:深度学习算法工程师 base:上海 技术一面 (9/15) - 30min 自我介绍 项目介绍,随后围绕项目进行展开提问,会议论文与期刊论文之间的差异 反问 部门主要做感知(车道线、行人感知。。。 技术二面 (9/21) - 30min 没开摄像头 自我介绍 项目介绍,所有项目都介绍了一遍 中途会被打断问问题 反问 对除了自己所研究的方向外,还了解哪些,知不知道reid的方法、目标检测算法什

  • 一面 深挖实习项目,问了算法的idea产生以及部署落地后的效果,最后问进一步改进方法 二面 第一部分考察对NeRF整个领域的了解,介绍了十多个下游领域方向代表的论文并说明优缺点;第二部分针对NeRF问我关注什么样的改进以及重点看哪方面的创新点,之后对NeRF+SDF的表面表达原理细节以及公式提问,接着问实习项目的创新点;第三部分针对他们业务中存在的问题问我有哪些方法或者建议;最后一部分简单过了鼠鼠

  • 8.26 测评 9.14 笔试 9.21 一面 自我介绍 项目介绍(细节深挖) BN层参数的作用 吸BN操作 样本不均衡问题 小目标问题 双线性插值(边界考虑) GAN网络能否落地 怎样提高特殊目标(电线杆、树)等目标的检测精度 反问 9.22 二面 自我介绍 项目介绍 编程能力和管理能力打分 团队管理方面(好多问题) 责任心考虑 地点考虑 期望薪资 offer考虑 互联网公司投递情况 为找工作做

  • 我在scikit learn中使用fit函数进行分类培训。例如,在使用随机林时,通常使用以下类型的代码: 不幸的是,在使用Python 3时,我得到了以下错误: C:\Anaconda3\lib\site-pack\skLearning\base.py:175: DeprecationWarning:inspect.getargspec()已弃用,请使用inspect.signature()代替林

  • 新手问题 我正在使用 TensorFlow 编写一个 OpenAI Gym 乒乓球运动员,到目前为止,我已经能够基于随机初始化创建网络,以便它会随机返回以向上或向下移动玩家桨。 时代结束后(在电脑获胜的21场比赛中),我收集了一组观察结果、动作和得分。一场比赛的最后观察得到一个分数,之前的每一次观察都可以根据贝尔曼方程进行评分。 现在我的问题是我还不明白的:我如何计算成本函数,以便它作为反向传播的

  • 数学优化 处理寻找一个函数的最小值(最大值或零)的问题。在这种情况下,这个函数被称为成本函数,或目标函数,或能量。 这里,我们感兴趣的是使用scipy.optimize来进行黑盒优化: 我们不依赖于我们优化的函数的算术表达式。注意这个表达式通常可以用于高效的、非黑盒优化。 先决条件 Numpy, Scipy matplotlib 也可以看一下: 参考 数学优化是非常 ... 数学的。如果你需要性能