partition-wise aggregation允许对每个分区分别执行的分区表进行分组或聚合。如果GROUP BY子句不包括分区键,则只能在每个分区的基础上执行部分聚合,并且必须稍后执行最终处理。由于partitionwise分组或聚合可能在计划期间占用大量CPU时间和内存,因此默认设置为关闭。

通过变量enable_partitionwise_aggregate控制是否启用该特性。

创建一个分区表,用于测试:

create table pagg_t (a int, b int, c text, d int) partition by list(c);
create table pagg_t_p1 partition of pagg_t for values in ('000', '001', '002', '003');
create table pagg_t_p2 partition of pagg_t for values in ('004', '005', '006', '007');
create table pagg_t_p3 partition of pagg_t for values in ('008', '009', '010', '011');
insert into pagg_t select i % 20, i % 30, to_char(i % 12, 'fm0000'), i % 30 from generate_series(0, 2999) i;
analyze pagg_t;

  

postgres=# show enable_partitionwise_aggregate;
off postgres=# explain (costs off) select c, sum(a), avg(b), count(*), min(a), max(b) from pagg_t group by c having avg(d) < 15 order by 1, 2, 3;
Sort
Sort Key: pagg_t_p1.c, (sum(pagg_t_p1.a)), (avg(pagg_t_p1.b))
-> HashAggregate
Group Key: pagg_t_p1.c
Filter: (avg(pagg_t_p1.d) < '15'::numeric)
-> Append
-> Seq Scan on pagg_t_p1
-> Seq Scan on pagg_t_p2
-> Seq Scan on pagg_t_p3 postgres=#

默认情况下,需要先分别扫描表的所有分区,将分区结果整合在一起(Append),然后执行哈希聚合(HashAggregate),最后进行排序(Sort)。

启用智能分区聚合功能,查看相同的聚合操作:

postgres=# set enable_partitionwise_aggregate=on;
SET
postgres=# show enable_partitionwise_aggregate;
on postgres=# explain (costs off) select c, sum(a), avg(b), count(*), min(a), max(b) from pagg_t group by c having avg(d) < 15 order by 1, 2, 3;
Sort
Sort Key: pagg_t_p1.c, (sum(pagg_t_p1.a)), (avg(pagg_t_p1.b))
-> Append
-> HashAggregate
Group Key: pagg_t_p1.c
Filter: (avg(pagg_t_p1.d) < '15'::numeric)
-> Seq Scan on pagg_t_p1
-> HashAggregate
Group Key: pagg_t_p2.c
Filter: (avg(pagg_t_p2.d) < '15'::numeric)
-> Seq Scan on pagg_t_p2
-> HashAggregate
Group Key: pagg_t_p3.c
Filter: (avg(pagg_t_p3.d) < '15'::numeric)
-> Seq Scan on pagg_t_p3 postgres=#

可以看到,启用该功能之后,先针对表中的所有分区执行哈希聚合(HashAggregate),然后将结果整合在一起(Append),最后进行排序(Sort)。其中,分区级别的聚合可以并行执行,性能会更好。

如果GROUP BY子句中没有包含分区字段,只会基于分区执行部分聚合操作,然后再对结果进行一次最终的聚合。

以下查询使用字段 a 进行分组聚合:

postgres=# explain (costs off) select a, sum(b), avg(b), count(*), min(a), max(b) from pagg_t group by a having avg(d) < 15 order by 1, 2, 3;
Sort
Sort Key: pagg_t_p1.a, (sum(pagg_t_p1.b)), (avg(pagg_t_p1.b))
-> Finalize HashAggregate
Group Key: pagg_t_p1.a
Filter: (avg(pagg_t_p1.d) < '15'::numeric)
-> Append
-> Partial HashAggregate
Group Key: pagg_t_p1.a
-> Seq Scan on pagg_t_p1
-> Partial HashAggregate
Group Key: pagg_t_p2.a
-> Seq Scan on pagg_t_p2
-> Partial HashAggregate
Group Key: pagg_t_p3.a
-> Seq Scan on pagg_t_p3 postgres=#

由于字段 a 不是分区键,所以先执行分区级别的部分哈希聚合(Partial HashAggregate),聚合的结果中可能存在相同的分组(不同分区中的字段 a 存在相同的值),需要执行最终的哈希聚合(Finalize HashAggregate)操作。

最新文章

  1. BZOJ1149[CTSC2007]风玲Mobiles
  2. mysql查询正在执行的进程
  3. String转double或者float会有精度丢失的问题
  4. SCOI2005栅栏
  5. Spring中自动装配(转)
  6. delphi 保存 和 打开 TREE VIEW的节点已经展开的状态
  7. C#解leetcode 64. Minimum Path Sum
  8. 推荐一款JavaScript日历控件:kimsoft-jscalendar
  9. 【c语言】求最大值
  10. python去掉html标签
  11. Openjudge-计算概论(A)-鸡尾酒疗法
  12. 事件g_Events
  13. Android隐藏软键盘
  14. JSSDK调用微信原生的功能上传图片保存到自己的服务器中
  15. js真乃神器也
  16. MT【89】三棱锥的体积公式
  17. Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化
  18. 如何将你的github仓库部署到github pages(转)
  19. springboot-day01-引入基础
  20. CentOS 安装Sqlite3

热门文章

  1. mysql高级用法(1)- mariadb的主从搭建
  2. 【OGG】OGG的单向复制配置-支持DDL(二)
  3. 用cmake构建gtk程序
  4. Docker02-重要概念
  5. Python 3.6 版本-使用Pytesseract 模块进行图像验证码识别
  6. Kali下的内网劫持(三)
  7. xpath+多进程爬取全书网纯爱耽美类别的所有小说。
  8. axio 请求中参数是数组
  9. http请求头出现provisional headers are shown
  10. Ranger安装部署 - solr安装