PostgreSQL16-新特性-并行聚合

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL16-新特性-并行聚合

1、并行聚合PG中并行聚合指:以并行和分布式的方式处理大数据集合的聚合函数(比如SUM、AVG、MAX、MIN等),从而是查询执行速度更快。其实和GreenPlum的分阶段聚合有些类似。执行聚合查询时,数据库系统自动将结果集分解成更小的部分,并在可用资源之间分配工作,然后组合结果以产生最终输出。这种方法可以显着提高大型数据集聚合查询的性能,但它需要足够的资源并且可能并不总是比串行执行更快。并不是所有聚合函数都支持所谓的Partial Mode”,这表示聚合有资格参与各种优化,例如并行聚合。array_agg()和string_agg()函数支持并行聚合。第一个函数采集所有输入值包括NULL到一个数组中,第二个将非NULL输入值连接成一个字符串。我们先看下这2个函数语法及执行效果:string_agg(expression,delimiter)string_agg函数能将结果集某个字段的所有行连接成字符串,并以delimiter分隔符分隔,expression表示要处理的字符类型数据


create table t1(id1 int, id2 varchar(64));
insert into t1 values(1,’nanjing’),(1,’suzhou’),(2,’xingtai’),(2,’shijiazhuang’);
select id1,string_agg(id2,’,’) group by id1;
id1 |   string_agg
------------------------------------
1  | nanjing,suzhou
2  | xingtai,shijiazhuang

array_agg函数和string_agg函数类似,最主要的区别为返回的类型为数组,数组数据类型同输入数据类型一致。


select id1,array_agg(id2) group by id1;
id1 |   array_agg
---------------------------------------
1  | {nanjing,suzhou}
2  | {xingtai,shijiazhuang}

2、PG16中有什么新功能?


David Rowley 为string_agg()和array_agg()函数实现了并行聚合的新功能。该补丁由Andres Freund、Tomas Vondra、Stephen Frost 和 Tom Lane 审核。由David Rowley提交。提交消息是This adds combine, serial and deserial functions for the array_agg() andstring_agg()aggregate functions, thus allowing these aggregates topartake in partial aggregations. This allows both parallel aggregation totake place when these aggregates are present and also allows additionalpartition-wise aggregation plan shapes to include plans that requireadditional aggregation once the partially aggregated results from thepartitions have been combined.Author: David RowleyReviewed-by: Andres Freund, Tomas Vondra, Stephen Frost, Tom

LaneDiscussion: https://postgr.es/m/CAKJS1f9sx_6GTcvd6TMuZnNtCh0VhBzhX6FZqw17TgVFH-ga_A@mail.gmail.com


3、并行聚合的效果

    test=# select version();
    version                                                  
    ----------------------------------------------------------------------------------------------------------
    PostgreSQL 16devel on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, 64-bit
    (1 row)
    test=# create table pagg_test (x int, y int);
    CREATE TABLE
    test=# insert into pagg_test
    test-# select (case x % 4 when 1 then null else x end), x % 10
    test-# from generate_series(1,5000) x;
    INSERT 0 5000
    test=# set parallel_setup_cost TO 0;
    SET
    test=# set parallel_tuple_cost TO 0;
    SET
    test=# set parallel_leader_participation TO 0;
    SET
    test=# set min_parallel_table_scan_size = 0;
    SET
    test=# explain select
    test-# y,
    test-# string_agg(x::text, ',') AS t,
    test-# string_agg(x::text::bytea, ',') AS b,
    test-# array_agg(x) AS a,
    test-# array_agg(ARRAY[x]) AS aa
    test-# from pagg_test
    test-# group by y;
                                              QUERY PLAN                                          
    ----------------------------------------------------------------------------------------------
     Finalize GroupAggregate  (cost=117.14..118.02 rows=10 width=132)
       Group Key: y
       ->  Gather Merge  (cost=117.14..117.37 rows=20 width=132)
             Workers Planned: 2
             ->  Sort  (cost=117.12..117.14 rows=10 width=132)
                   Sort Key: y
                   ->  Partial HashAggregate  (cost=116.75..116.95 rows=10 width=132)
                         Group Key: y
                         ->  Parallel Seq Scan on pagg_test  (cost=0.00..48.00 rows=2500 width=8)
    (9 rows)

    我们在PostreSQL 13 集群上尝试相同的测试。PostgreSQL 14 和 15 的输出EXPLAIN相同。

      ...
                                          QUERY PLAN
      ----------------------------------------------------------------------------------
       HashAggregate  (cost=185.50..185.70 rows=10 width=132)
         Group Key: y
         ->  Gather  (cost=0.00..48.00 rows=5000 width=8)
               Workers Planned: 2
               ->  Parallel Seq Scan on pagg_test  (cost=0.00..48.00 rows=2500 width=8)
      (5 rows)

      我们无法比较时间,但我们可以比较成本。如您所见,即将实施并行聚合的PostgreSQL 16 的最终成本为118.02!之前版本的最终执行成本为185.70成本是以任意单位表示的查询执行时间的估计度量,表示执行查询计划中的特定步骤所需的处理能力。它通常表示CPU、I/O 和内存使用情况的组合,帮助查询计划者选择最快的执行计划。


      4、原文


      https://www.cybertec-postgresql.com/en/tag/whats-new/

      相关实践学习
      使用PolarDB和ECS搭建门户网站
      本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
      阿里云数据库产品家族及特性
      阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
      目录
      相关文章
      |
      10月前
      |
      存储 关系型数据库 数据库
      深入了解 PostgreSQL:功能、特性和部署
      PostgreSQL,通常简称为Postgres,是一款强大且开源的关系型数据库管理系统(RDBMS),它在数据存储和处理方面提供了广泛的功能和灵活性。本文将详细介绍 PostgreSQL 的功能、特性以及如何部署和使用它。
      536 1
      深入了解 PostgreSQL:功能、特性和部署
      |
      9月前
      |
      消息中间件 存储 关系型数据库
      PostgreSQL技术大讲堂 - 第33讲:并行查询管理
      PostgreSQL从小白到专家,技术大讲堂 - 第33讲:并行查询管理
      433 1
      |
      存储 关系型数据库 数据库
      探索PostgreSQL 14新特性--SEARCH和CYCLE
      探索PostgreSQL 14新特性--SEARCH和CYCLE
      70 0
      |
      缓存 监控 关系型数据库
      [译]PostgreSQL16-新特性-新增IO统计视图:pg_stat_io
      [译]PostgreSQL16-新特性-新增IO统计视图:pg_stat_io
      198 0
      |
      存储 缓存 关系型数据库
      PostgreSQL 14新特性--减少索引膨胀
      PostgreSQL 14新特性--减少索引膨胀
      437 0
      |
      存储 SQL Oracle
      AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
      AnalyticDB PostgreSQL 7.0 新增了存储过程功能的支持,让用户在使用ADB PG时能够更方便高效地开发业务,并能够更好地兼容Oracle等传统数仓的业务。
      459 1
      AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
      |
      SQL 关系型数据库 Linux
      知识分享之PostgreSQL——OIDS的特性与新版本去除SQL
      之前一直使用的PostgreSQL 9.6系列版本,由于官方不再维护了,就准备换成最新稳定版本的,查看了一下官方版本说明,发现13系列版本是目前稳定性较好的版本,于是兴冲冲的更换了过来,但随之而来的就是一些新特性,其中就比如表中的OID字段,这个字段是对象标识符,之前能用于行标记,现在发现只有表才具有这个隐藏字段,行数据没有这个支持了,于是就需要将老版本的表进行关闭掉这个字段。下面我们就开始关闭之旅。
      144 0
      知识分享之PostgreSQL——OIDS的特性与新版本去除SQL
      |
      SQL 存储 算法
      PostgreSQL并行HashJoin解读
      PostgreSQL并行HashJoin解读
      PostgreSQL并行HashJoin解读
      |
      SQL 存储 JSON
      PostgreSQL 14 版本特性浅析
      ## 性能增强 ### 大量连接高并发优化 - 场景: SaaS场景,微服务架构下的中心库场景 - 业务特点:客户端多,在线用户多,数据库并发连接非常多 - 价值: 比连接池网络少1跳, 性能更好, 支持绑定变量等连接池会话模式不支持的全部功能 ### 索引增强 1. 缓解高频更新负载下的btree索引膨胀 - 场景: 数据频繁更新,如游戏、交易、共享出行、IoT等行业 - 价值: 减少膨胀
      |
      关系型数据库 分布式数据库 PolarDB
      《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
      《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
      334 0