问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求教SQL server 聚合函数问题

发布网友 发布时间:2022-04-11 15:40

我来回答

2个回答

懂视网 时间:2022-04-11 20:02

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 2000 行转列的实现(横排)
  • Sql Server 字符串聚合函数
  • sqlserver2005 行列转换实现方法
  • sqlserver 行列互转实现小结
  • sqlserver下将数据库记录的列记录转换成行记录的方法
  • SQLServer行转列实现思路记录
  • SQLServer行列互转实现思路(聚合函数)
  • 热心网友 时间:2022-04-11 17:10

    sqlserver位运算分享

    使用下面脚本,试一试,看看可否?

       select sum([col1]|[col1]) from table

    这样可以吗?

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    儿歌祖国妈妈我爱你是谁写的汇总28句 为什么有的人学几何很厉害数学却不行 一个人数学几何好,但是其他计算方面的都马马虎虎,那么说明这个人怎么... 数学几何好的人,就是一道几何题很快就能想出来的人是不很聪明?这能练... 固安尚城国际怎么样 驾驶员咨询服务营业执照经营范围怎么写 驾校属于什么经营范围 核桃粉保质期多长时间 亿生康宝筋骨冷敷凝胶只在国内销售吗? 清河镇概况 sqlserver聚合函数是不是效率很低 求一个oracle 去重复记录完整sql语句或者用 hibnate+ distinct 的完整例子 joint venture是什么意思 distinct triplets什么意思 如何distinct 只对一个字段有用,同时查出其他字段 针对某个字段distinct,该怎么做 关于SQL中Distinct的疑问,如何返回所有的字段? SQL 语句提问 distinct count的疑问。 sql语句 distinct 查询疑问 T-SQL中DISTINCT 命令的疑问 用sql语句SELECT *,ROW_NUMBER() OVER(PARTITION BY a ORDER BY a ASC) AS NUM FROM 十二月 怎么在SQL2000里实现row_number()的功能! sql server 如何给相同的记录编上一定格式的编号呢 SQL server PARTITION BY 是什么意思 SQL数据附加失败错误3456求救 sql服务无法启动,错误代码3417,麻烦高手解决下,3Q~~ Windows不能在本地计算机启动SQL Server (MSSQLSERVER),并参与特定服务错误代码3417之类的的提示 SQL Server Analysis Services(MSSQLSERVER)启动失败 急!高手来!windows不能在本地计算机启动sql server(MSSQLSERVER)错误代码:17114 什么情况下导致 sql error 3313,3314,3414 sqlserver聚合函数可以使用分页吗 怎么在SQLServer计算列和平均值 求解一个聚合函数的Sql语句!!! mysql数据库怎么导出到另一个数据库中 SQL数据库怎样将几行的数据复制到到另外一个数据库里 为什么我用sqlloader从文本往oracle里导数时,有个文字很多的字段老提示“数据文件的字段超出最大长度”? SQL LOADER处理换行数据的问题 sqlprofiler 安装时候的错误,请高手指教 sqlloader插入数据触发器为什么没有生效? java连接sql server数据库时出现错误 SqlLoader怎么使用 Oracle数据库不在本地怎么使用sqlloader 使用sqlloader怎样导入txt sql loader导入数据如何把上传文件夹名作为 java或者其框架怎么使用sqlloader 和imp mysql中可以用sqlloader吗 求助sqlserver服务器压力问题 [HP]时间悖论 全文+番外txt sqlserver如何查看哪个进程堵塞 怎么在存储过程用事务避免并发