Atitit  数据存储的分组聚合 groupby的实现attilax总结

Atitit  数据存储的分组聚合 groupby的实现attilax总结

1. 聚合操作1

1.1. a、标量聚合 流聚合1

1.2. b、哈希聚合2

1.3. 所有的最优计划的选择都是基于现有统计信息来评估3

1.4. 参考资料3

1. 聚合操作

聚合也是我们在写T-SQL语句的时候经常遇到的,我们来分析一下一些常用的聚合操作运算符的特性和可优化项。

1.1. a、标量聚合 流聚合

标量聚合是一种常用的数据聚合方式,比如我们写的语句中利用的以下聚合函数:MAX()、MIN()、AVG()、COUNT()、SUM()

以上的这些数据结果项的输出基本都是通过流聚合的方式产生,并且这个运算符也被称为:标量聚合

其实,流聚合这种算法最常用的方式是分组(GROUP BY)计算,上面的标量计算也是利用这个特性,只不过把整体形成了一个大组进行聚合。

我么通过如下代码理解

clear the current aggredate results

clear the current group by columnsfor each input row

begin

if the input row does not match the current group by columns

begin

output the current aggreagate results(if any)

clear the current aggreagate results

set the current group by columns to the input row

end

update the aggregate results with the input row

end

流聚合运算符其实过程很简单,维护一个聚合组和聚合值,依次扫描表中的数据,如果能不匹配聚合组则忽略,如果匹配,则加入到聚合组中并且更新聚合值结果项。

举个例子

SELECT ShipAddress,ShipCity,COUNT(*)

FROM Orders

GROUP BY ShipAddress,ShipCity

所以这里我们已经总结出对于流聚合的一种优化方式:尽量避免排序产生,而要避免排序就需要将分组(Group by)字段在索引覆盖范围内。

1.2. b、哈希聚合

上述的流聚合的方式需要提前排序,我们知道排序是一个非常大的消耗过程,所以不适合大表的分组聚合操作,为了解决这个问题,又引入了另外一种聚合运算:哈希聚合

所谓的哈希聚合内部的方法和本篇前面提到的哈希连接机制一样。

哈希聚合不需要排序和过大的内存消耗,并且很容易并行执行计划,利用多CPU同步进行,但是有一个缺点就是:这一过程是阻塞的,也就说哈希聚合不会产生任何结果直到完整的输入。

所以在大数据表中采用哈希聚合是一个很好的应用场景。

我们知道排序是很耗资源的一件事情,但是利用哈希匹配只需要将不同的列值进行提取就可以,所以相比性能而言,无疑哈希匹配算法在这里是略胜一筹的算法。

1.3. 所有的最优计划的选择都是基于现有统计信息来评估

而上面关于这两列内容分布类型SQL Server是怎样知道的?这就是SQL Server的强大的统计信息在支撑了。

在SQL Server中并不是固定的语句就会形成特定的计划,并且生成的特定计划也不是总是最优的,这和数据库现有数据表中的内容分布、数据量、数据类型等诸多因素有关,而记录这些详细信息的就是统计信息。

所有的最优计划的选择都是基于现有统计信息来评估,如果我们的统计信息未及时更新,那么所评估出来最优的执行计划将不是最好的,有时候反而是最烂的。

1.4. 参考资料

SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析) - 指尖流淌 - 博客园.html

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王"Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak

简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴

全名::Emir Attilax Akbar bin Mahmud bin  attila bin Solomon Al Rapanui

埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门  阿尔 拉帕努伊

常用名:艾提拉(艾龙),   EMAIL:[email protected]

转载请注明来源:attilax的专栏   http://www.cnblogs.com/attilax/

--Atiend

时间: 2024-12-15 01:48:23

Atitit  数据存储的分组聚合 groupby的实现attilax总结的相关文章

Atitit 数据存储视图的最佳实际best practice attilax总结

1.1. 视图优点:可读性的提升1 1.2. 结论  本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应该优先使用视图2 1.3. 视图的缺点:复杂视图有时可能带来性能下降3 1.1. 视图优点:可读性的提升 视图的主要作用有以下几点:视点集中:使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务简化操作:,若视图本身就是一个复杂查询的结果集,这样在每一次执行相同的查询时,不必重新写这些复杂的查询语句 定制数据:视图能够实现让不同的用户以不同的方式看到不同或相同的数据集 合并分割

Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql

Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql 1. 图16.1:MySQL体系结构1 2. 16.7. 创建表create()虚拟函数:2 3. 16.8. 打开表 open()2 4. ---------------------------------------------------------------------------------------------------------------------2 5. 16.9. 实施基本的

Atitit 数据存储的数据表连接attilax总结

1.1. 三种物理连接运算符:嵌套循环连接.合并连接以及哈希连接1 1.2. a.嵌套循环连接(nested loops join)1 1.3. b.合并连接(merge join)3 1.4. c.哈希连接(hash join) 4 1.5. 所以这三种算法,没有谁好谁坏,只有合适的场景应用合适的连接算法,这样才能发挥它自身的长处,而恰巧这些就是我们要掌握的技能.6 1.6. 这三种连接算法我们也可以显示的指定,loop merger hash6 1.7. 所有的最优计划的选择都是基于现有统计

reduce端连接-分区分组聚合

1.1.1         reduce端连接-分区分组聚合 reduce端连接则是利用了reduce的分区功能将stationid相同的分到同一个分区,在利用reduce的分组聚合功能,将同一个stationid的气象站数据和温度记录数据分为一组,reduce函数读取分组后的第一个记录(就是气象站的名称)与其他记录组合后输出,实现连接.例如连接下面气象站数据集和温度记录数据集.先用几条数据做分析说明,实际肯定不只这点数据. 气象站数据集,气象站id和名称数据表 StationId Statio

reduce连接是怎么按组合键分组聚合功能原理详解

1.reduce连接实现目标 气象站数据集,气象站id和名称数据表 StationId StationName 1~hangzhou 2~shanghai 3~beijing 温度记录数据集 StationId  TimeStamp Temperature 3~20200216~6 3~20200215~2 3~20200217~8 1~20200211~9 1~20200210~8 2~20200214~3 2~20200215~4 目标:是将上面两个数据集进行连接,将气象站名称按照气象站id

Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结

分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据库理论,网状,层次, 数据库理论树形数据库注册表,hashtable 数据库理论,kv数据库.hashtable 数据库理论Oodb 数据库理论nosql db 数据库理论隔离级别 数据库理论 数据库理论Er模型 数据库理论Acid数据库完整性 数据库理论关系模型 数据库理论   sql 数据库理论 数据库理论存储过程 数据库理论 触发器 数据库理论 视图 约束 数据库理论 数据

Elasticsearch分组聚合-查询每个A_logtype下有多少数据

Elasticsearch分组聚合 1.查询指定索引下每个A_logtype有多少数据 curl -XPOST 'localhost:19200/ylchou-0-2015-10-07/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "A_logtype" } } }

Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型  按查找方式分,两种,分块索引 vs编号索引1 1.3. 顺序索引  vs 散列索引2 1.4. 按索引与数据的查找顺序可分为 正排与倒排索引2 1.5. 单列索引与多列索引 复合索引2 1.6. 分区索引和全局索引 2 1.7.  Trie树一般指字典树 又称单词查找树,Trie树2 1.8. 稠密索引 vs 稀疏索引3 1.9. 多级索引 vs 单击索引3 1.10.

Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 索引的类型  按查找方式分,两种,分块索引 vs编号索引1 1.2. 按索引与数据的查找顺序可分为 正排与倒排索引1 1.3. 单列索引与多列索引2 1.4. 分区索引和全局索引 2 2. 索引建立,更新的流程使用触发更新索引的事件2 3. 索引常用的存储结构 B树文件 叫做“索引顺序存取方法”(Indexed Sequential Access Method),缩写为ISAM.2 4.  Trie