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)操作。

PostgreSQL中的partition-wise aggregation的更多相关文章

  1. PostgreSQL中的partition-wise join

    与基于继承的分区(inheritance-based partitioning)不同,PostgreSQL 10中引入的声明式分区对数据如何划分没有任何影响.PostgreSQL 11的查询优化器正准 ...

  2. PostgreSQL中RECURSIVE递归查询使用总结

    RECURSIVE 前言 CTE or WITH 在WITH中使用数据修改语句 WITH使用注意事项 RECURSIVE 递归查询的过程 拆解下执行的过程 1.执行非递归部分 2.执行递归部分,如果是 ...

  3. 通过arcgis在PostgreSQL中创建企业级地理数据库

    部署环境: Win7 64位旗舰版 软件版本: PostgreSQL-9.1.3-2-windows-x64 Postgis-pg91x64-setup-2.0.6-1 Arcgis 10.1 SP1 ...

  4. PostgreSQL 中日期类型转换与变量使用及相关问题

    PostgreSQL中日期类型与字符串类型的转换方法 示例如下: postgres=# select current_date; date ------------ 2015-08-31 (1 row ...

  5. PostgreSQL 中定义自己需要的数据类型

    PostgreSQL解决某系数据库中的tinyint数据类型问题,创建自己需要的数据类型如下: CREATE DOMAIN tinyint AS smallint CONSTRAINT tinyint ...

  6. 在PostgreSQL中使用oracle_fdw访问Oracle

    本文讲述如何在PostgreSQL中使用oracle_fdw访问Oracle上的数据. 1. 安装oracle_fdw 可以参照:oracle_fdw in github 编译安装oracle_fdw ...

  7. [原创]PostgreSQL中十进制、二进制、十六进制之间的相互转换

    在PostgreSQL中,二进制.十进制.十六进制之间的转换是非常方便的,如下: 十进制转十六进制和二进制 mydb=# SELECT to_hex(10); to_hex -------- a (1 ...

  8. 用python随机生成数据,再插入到postgresql中

    用python随机生成学生姓名,三科成绩和班级数据,再插入到postgresql中. 模块用psycopg2 random import random import psycopg2 fname=[' ...

  9. PostgreSQL 中如何实现group_concat

    之前在MySQL中使用group_concat,觉得超级好用. 今天在PostgreSQL需要用到这样的场景,就去学习了一下. 在PostgreSQL中提供了arr_agg的函数来实现聚合,不过返回的 ...

  10. Postgresql中临时表(temporary table)的特性和用法

    熟悉Oracle的人,相比对临时表(temporary table)并不陌生,很多场景对解决问题起到不错的作用,开源库Postgresql中,也有临时表的概念,虽然和Oracle中临时表名字相同,使用 ...

随机推荐

  1. day 26作业

    作业 1.整理TCP三次握手.四次挥手图 三次握手 起初A和B都处于CLOSED状态--B创建TCB,处于LISTEN状态,等待A请求--A创建TCB,发送连接请求(SYN=1,seq=x),进入SY ...

  2. kubernetes 清理孤儿POD--转发

    孤儿pod的产生 节点OOM以后或者节点异常崩溃的情况下,pod未能被正常的清理而导致的孤儿进程. 提示如下 Orphaned pod found - but volume paths are sti ...

  3. Ceph添加、删除osd及故障硬盘更换

    添加或删除osd均在ceph部署节点的cent用户下的ceph目录进行. 1. 添加osd 当前ceph集群中有如下osd,现在准备新添加osd: (1)选择一个osd节点,添加好新的硬盘: (2)显 ...

  4. python关于time几种格式处理方法总结

    一.日期时间的表示方法: 时间戳 timestamp: 简介:时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,是一个float类型 展示形式:1575278720.331 时间 ...

  5. [USACO15DEC]最大流Max Flow(树上差分)

    题目描述: Farmer John has installed a new system of N−1N-1N−1 pipes to transport milk between the NNN st ...

  6. Kotlin注解深入解析与实例剖析

    在上一次https://www.cnblogs.com/webor2006/p/11522798.html中学习了Kotlin注解相关的东东,这次继续对Kotlin的注解继续学习: 注解也可以拥有自己 ...

  7. waitpid()函数

    waitpid函数 作用同于wait,但可指定pid进程清理,可以不阻塞. pid_t waitpid(pid_t pid,int *status,int options);成功:返回清理掉的子进程I ...

  8. 算法图解(python3版本)--读后感

    本想写详细点,但入门书籍没啥干货,一天就看完了,简单介绍下: 大纲--两方面 一.介绍算法是什么:算法的作用,判断算法效率高低的指标 ①通过编程解决问题的思路,或者说程序本身就是算法,算法作用是为了提 ...

  9. 《Maven在Java项目开发中的应用》论文笔记(十七)

    标题:Maven在Java项目开发中的应用 一.基本信息 时间:2019 来源:山西农业大学 关键词:Maven:Java Web:仓库:开发人员:极限编程; 二.研究内容 1.Maven 基本原理概 ...

  10. [BZOJ 5127][Lydsy1712月赛]数据校验

    Description 题库链接 给你一个长度为 \(n\) 的序列.\(m\) 次询问,每次询问序列的一个区间 \([l,r]\).对于 \([l,r]\) 内的所有子区间,询问值域是否连续.若存在 ...