SQL调优指南—SQL调优进阶—聚合优化和执行

简介: 本文介绍如何优化器和执行器如何处理聚合(Group-by),以达到减少数据传输量和提高执行效率的效果。

基本概念

聚合操作(Aggregate,简称Agg)语义为按照GROUP BY指定列对输入数据进行聚合的计算,或者不分组、对所有数据进行聚合的计算。PolarDB-X支持如下聚合函数:

  • COUNT
  • SUM
  • AVG
  • MAX
  • MIN
  • BIT_OR
  • BIT_XOR
  • GROUP_CONCAT

聚合(Agg)

本文介绍均为不下推的Agg的实现。如果已被下推到LogicalView中,则由存储层MySQL来选择执行方式,聚合(Agg)由两种主要的算子HashAgg和SortAgg实现。

HashAgg

HashAgg利用哈希表实现聚合:

  1. 根据输入行的分组列的值,通过Hash找到对应的分组。
  2. 按照指定的聚合函数,对该行进行聚合计算。
  3. 重复以上步骤直到处理完所有的输入行,最后输出聚合结果。


> explain select count(*) from t1 join t2 on t1.id = t2.id group by t1.name,t2.name;
Project(count(*)="count(*)")
  HashAgg(group="name,name0", count(*)="COUNT()")
    BKAJoin(condition="id = id", type="inner")
      Gather(concurrent=true)
        LogicalView(tables="t1", shardCount=2, sql="SELECT `id`, `name` FROM `t1` AS `t1`")
      Gather(concurrent=true)
        LogicalView(tables="t2_[0-3]", shardCount=4, sql="SELECT `id`, `name` FROM `t2` AS `t2` WHERE (`id` IN ('?'))")

Explain结果中,HashAgg算子还包含以下关键信息:

  • group:表示GROUP BY字段,示例中为name,name0分别引用t1,t2表的name列,当存在相同别名会通过后缀数字区分 。
  • 聚合函数:等号(=) 前为聚合函数对应的输出列名,其后为对应的计算方法。示例中 count(*)="COUNT()" ,第一个 count(*) 对应输出的列名,随后的COUNT()表示对其输入数据进行计数。

HashAgg对应可以通过Hint来关闭:/*+TDDL:cmd_extra(ENABLE_HASH_AGG=false)*/

SortAgg

SortAgg在输入数据已按分组列排序的情况,对各个分组依次完成聚合。

  • 保证输入按指定的分组列排序(例如,可能会看到 MergeSort 或 MemSort)。
  • 逐行读入输入数据,如果分组与当前分组相同,则对其进行聚合计算。
  • 如果分组与当前分组不同,则输出当前分组上的聚合结果。

相比 HashAgg,SortAgg 每次只要处理一个分组,内存消耗很小;相对的,HashAgg 需要把所有分组存储在内存中,需要消耗较多的内存。


> explain select count(*) from t1 join t2 on t1.id = t2.id group by t1.name,t2.name order by t1.name, t2.name;

Project(count()="count()")
MemSort(sort="name ASC,name0 ASC")
HashAgg(group="name,name0", count(*)="COUNT()")
BKAJoin(condition="id = id", type="inner")
Gather(concurrent=true)
LogicalView(tables="t1", shardCount=2, sql="SELECT `id`, `name` FROM `t1` AS `t1`")
Gather(concurrent=true)
LogicalView(tables="t2_[0-3]", shardCount=4, sql="SELECT `id`, `name` FROM `t2` AS `t2` WHERE (`id` IN ('?'))")

SortAgg对应可以通过Hint来关闭:/+TDDL:cmd_extra(ENABLE_SORT_AGG=false)/

两阶段聚合优化

两阶段聚合,即通过将Agg拆分为部分聚合(Partial Agg)和最终聚合(Final Agg)的两个阶段,先对部分结果集做聚合,然后将这些部分聚合结果汇总,得到整体聚合的结果。

如下示例的SQL中,HashAgg 中拆分出的部分聚合(PartialAgg)会被下推至MySQL上的各个分表,而其中的AVG函数也被拆分成 SUM和 COUNT 以实现两阶段的计算:


> explain select avg(age) from t2 group by name
Project(avg(age)="sum_pushed_sum / sum_pushed_count")
HashAgg(group="name", sum_pushed_sum="SUM(pushed_sum)", sum_pushed_count="SUM(pushed_count)")
Gather(concurrent=true)
LogicalView(tables="t2_[0-3]", shardCount=4, sql="SELECT `name`, SUM(`age`) AS `pushed_sum`, COUNT(`age`) AS `pushed_count` FROM `t2` AS `t2` GROUP BY `name`")

两阶段聚合的优化能大大减少数据传输量、提高执行效率。

总的来说,大部分场景做聚合的时候都倾向于选择HashAgg,只要当以下场景下才适合选择SortAgg做聚合:

  1. 数据比较多,内存严重不足。
  2. 聚合算子的输入已经按照Group By 列做好排序,这样做SortAgg就不需要额外排序,执行效率会更高。
  3. 当数据有严重倾斜,导致HashAgg执行效率不高,优先使用SortAgg
相关文章
|
人工智能 算法 搜索推荐
《智育新篇:点亮学生人工智能伦理与社会责任之光》
在人工智能迅猛发展的时代,其应用已渗透到生活的方方面面,深刻改变着我们的生活模式与社会架构。然而,随之而来的伦理和社会责任问题也日益凸显。教育者需在课堂中融入伦理思辨,通过具体案例引导学生理解AI的伦理边界,如人脸识别技术的应用与隐私保护、智能机器人决策中的道德困境等。同时,培养学生的社会责任意识,使其认识到AI应服务于社会福祉,避免因商业利益导致资源分配不均。学校应搭建多元实践平台,鼓励学生参与公益项目和政策讨论,增强其对社会责任的情感认同。在全球化背景下,拓展国际视野,深化跨文化交流,共同应对AI带来的全球性挑战。
476 25
|
8月前
|
传感器 人工智能 安全
云计算平台如何支持智慧工地?
云计算平台作为智慧工地的核心技术,通过整合数据、算力与智能分析能力,为工地管理提供全流程数字化服务。其主要作用体现在五个层面:一是构建数据中枢,实现多源数据整合与边缘计算协同;二是通过AI模型训练和大数据预测,提供智能分析与决策支持;三是多端协同与弹性扩展,满足不同场景需求;四是强化安全与绿色施工,优化能耗并保障数据安全;五是打造生态化平台,开放API接口并采用微服务架构扩展功能。云计算推动工地管理从经验驱动转向数据驱动,未来结合5G与数字孪生技术,将进一步提升实时模拟能力。
389 2
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
812 0
|
11月前
|
搜索推荐 数据挖掘 BI
产品电子画册制作软件哪个好?排名前6的软件都在这里
简要评测Adobe InDesign、草料二维码、创客贴、样本云、云展网、名编辑6款常见的产品电子画册制作工具,让你在选择出更适合自己的工具
|
缓存 安全 程序员
易语言在跨平台开发中有哪些常见的技术挑战和解决方案?
易语言在跨平台开发中有哪些常见的技术挑战和解决方案?
226 2
|
机器学习/深度学习 人工智能 安全
智能时代的隐私守护者:AI加密技术的崛起与挑战###
本文深入探讨了人工智能(AI)在数据加密领域的创新应用,分析了AI如何增强数据安全性,同时也指出了面临的挑战和未来发展趋势。通过具体案例分析,展现了AI加密技术在保护个人隐私与促进数据安全方面的潜力,为读者提供对未来智能时代隐私保护的深刻洞见。 ###
|
数据处理
大学物理-实验篇——测量误差与数据处理(测量分类、误差、有效数字、逐差法)
大学物理-实验篇——测量误差与数据处理(测量分类、误差、有效数字、逐差法)
1350 11
|
机器学习/深度学习
探索机器学习中的超参数调优策略
在机器学习模型的训练过程中,超参数的选择和调优对模型性能有着至关重要的影响。本文探讨了不同的超参数调优策略,分析了它们的优缺点,并结合实际案例展示了如何有效地选择和调整超参数以提升模型的准确性和泛化能力。
595 1
|
人工智能 缓存 安全
关于32位系统和64位系统的区别
关于32位系统和64位系统的区别