PostgreSQL 11 preview - 分区表智能并行聚合、分组计算(已类似MPP架构,性能暴增)

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

标签

PostgreSQL , 分区 , 智能聚合 , 智能分组计算 , enable_partition_wise_agg


背景

PostgreSQL 并行计算开始在细节方面进行打磨,例如11已添加了JOIN的分区并行,当两个分区表的分区定义一致时,在分区字段上JOIN就可以用到分区与分区之间直接并行JOIN,而不需要将数据APPEND后在JOIN。

《PostgreSQL 11 preview - 分区表智能并行JOIN (已类似MPP架构,性能暴增)》

现在又一个PATCH要提交了,还是和分区表有关,这次是以分区为单位的聚合、分组计算。

实际上也蛮好理解的,分两种情况,

1、一种是多阶段聚合,原理如下:(常用在MPP数据库,目前PG的单表多阶段并行聚合也是这么做的)

《PostgreSQL 10 自定义并行计算聚合函数的原理与实践 - (含array_agg合并多个数组为单个一元数组的例子)》

2、第二种是智能分区并行聚合,这种情况与第一种不矛盾,但是在非多阶段聚合时也可能能起到优化作用,比如说根据分区字段进行分组聚合,那么分区与分区之间实际上是没有计算集合的重叠的,各自算各自的。

Hi all,  
  
Declarative partitioning is supported in PostgreSQL 10 and work is already  
in  
progress to support partition-wise joins. Here is a proposal for  
partition-wise  
aggregation/grouping.  Our initial performance measurement has shown 7 times  
performance when partitions are on foreign servers and approximately 15%  
when  
partitions are local.  
  
Partition-wise aggregation/grouping computes aggregates for each partition  
separately.  If the group clause contains the partition key, all the rows  
belonging to a given group come from one partition, thus allowing aggregates  
to be computed completely for each partition.  Otherwise, partial aggregates  
computed for each partition are combined across the partitions to produce  
the  
final aggregates. This technique improves performance because:  
i. When partitions are located on foreign server, we can push down the  
aggregate to the foreign server.  
ii. If hash table for each partition fits in memory, but that for the whole  
relation does not, each partition-wise aggregate can use an in-memory hash  
table.  
iii. Aggregation at the level of partitions can exploit properties of  
partitions like indexes, their storage etc.  
  
Attached an experimental patch for the same based on the partition-wise join  
patches posted in [1].  
  
This patch currently implements partition-wise aggregation when group clause  
contains the partitioning key.  A query below, involving a partitioned table  
with 3 partitions containing 1M rows each, producing total 30 groups showed  
15% improvement over non-partition-wise aggregation. Same query showed 7  
times  
improvement when the partitions were located on the foreign servers.  
Patch needs a lot of improvement including:  
1. Support for partial partition-wise aggregation  
2. Estimating number of groups for every partition  
3. Estimating cost of partition-wise aggregation based on sample partitions  
similar to partition-wise join  
and much more.  
  
In order to support partial aggregation on foreign partitions, we need  
support  
to fetch partially aggregated results from the foreign server. That can be  
handled as a separate follow-on patch.  
  
Though is lot of work to be done, I would like to get suggestions/opinions  
from  
hackers.  
  
I would like to thank Ashutosh Bapat for providing a draft patch and helping  
me off-list on this feature while he is busy working on partition-wise join  
feature.  
  
[1]  
https://www.postgresql.org/message-id/CAFjFpRcbY2QN3cfeMTzVEoyF5Lfku-ijyNR%3DPbXj1e%3D9a%3DqMoQ%40mail.gmail.com  
  
Thanks  
  
--   
Jeevan Chalke  
Principal Software Engineer, Product Development  
EnterpriseDB Corporation  
The Enterprise PostgreSQL Company  

这里有两个例子:

开启分区智能聚合,各个分区聚合后再APPEND结果。

Here is the sample plan:  
  
postgres=# set enable_partition_wise_agg to true;  
SET  
postgres=# EXPLAIN ANALYZE SELECT a, count(*) FROM plt1 GROUP BY a;  
                                                  QUERY  
PLAN  
--------------------------------------------------------------------------------------------------------------  
 Append  (cost=5100.00..61518.90 rows=30 width=12) (actual  
time=324.837..944.804 rows=30 loops=1)  
   ->  Foreign Scan  (cost=5100.00..20506.30 rows=10 width=12) (actual  
time=324.837..324.838 rows=10 loops=1)  
         Relations: Aggregate on (public.fplt1_p1 plt1)  
   ->  Foreign Scan  (cost=5100.00..20506.30 rows=10 width=12) (actual  
time=309.954..309.956 rows=10 loops=1)  
         Relations: Aggregate on (public.fplt1_p2 plt1)  
   ->  Foreign Scan  (cost=5100.00..20506.30 rows=10 width=12) (actual  
time=310.002..310.004 rows=10 loops=1)  
         Relations: Aggregate on (public.fplt1_p3 plt1)  
 Planning time: 0.370 ms  
 Execution time: 945.384 ms  
(9 rows)  

关闭分区智能聚合,需要将数据汇聚后,再进行聚合操作。

postgres=# set enable_partition_wise_agg to false;  
SET  
postgres=# EXPLAIN ANALYZE SELECT a, count(*) FROM plt1 GROUP BY a;  
                                                              QUERY  
PLAN  
---------------------------------------------------------------------------------------------------------------------------------------  
 HashAggregate  (cost=121518.01..121518.31 rows=30 width=12) (actual  
time=6498.452..6498.459 rows=30 loops=1)  
   Group Key: plt1.a  
   ->  Append  (cost=0.00..106518.00 rows=3000001 width=4) (actual  
time=0.595..5769.592 rows=3000000 loops=1)  
         ->  Seq Scan on plt1  (cost=0.00..0.00 rows=1 width=4) (actual  
time=0.007..0.007 rows=0 loops=1)  
         ->  Foreign Scan on fplt1_p1  (cost=100.00..35506.00 rows=1000000  
width=4) (actual time=0.587..1844.506 rows=1000000 loops=1)  
         ->  Foreign Scan on fplt1_p2  (cost=100.00..35506.00 rows=1000000  
width=4) (actual time=0.384..1839.633 rows=1000000 loops=1)  
         ->  Foreign Scan on fplt1_p3  (cost=100.00..35506.00 rows=1000000  
width=4) (actual time=0.402..1876.505 rows=1000000 loops=1)  
 Planning time: 0.251 ms  
 Execution time: 6499.018 ms  
(9 rows)  

场景

1、枚举、哈希分区表:

因为在不同分区中,分区字段值非常鲜明分离。可以按分区字段聚合,按分区字段GROUP BY。

2、范围分区表:

某些按分区字段GROUP BY(看GROUP BY的表达式是否有优化空间)

3、继承表,根据子表约束,选择是否可以使用分区智能聚合、GROUP。

参考

https://www.postgresql.org/message-id/flat/CAM2+6=V64_xhstVHie0Rz=KPEQnLJMZt_e314P0jaT_oJ9MR8A@mail.gmail.com#CAM2+6=V64_xhstVHie0Rz=KPEQnLJMZt_e314P0jaT_oJ9MR8A@mail.gmail.com

https://commitfest.postgresql.org/17/1250/

相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
4月前
|
存储 调度 C++
16 倍性能提升,成本降低 98%! 解读 SLS 向量索引架构升级改造
大规模数据如何进行语义检索? 当前 SLS 已经支持一站式的语义检索功能,能够用于 RAG、Memory、语义聚类、多模态数据等各种场景的应用。本文分享了 SLS 在语义检索功能上,对模型推理和部署、构建流水线等流程的优化,最终带给用户更高性能和更低成本的针对大规模数据的语义索引功能。
461 53
|
6月前
|
存储 数据挖掘 BI
2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
波司登集团升级大数据架构,采用阿里云数据库 SelectDB 版,实现资源隔离与弹性扩缩容,查询性能提升 2-5 倍,总体成本降低 30% 以上,效率提升 30%,助力销售旺季高效运营。
446 9
|
8月前
|
人工智能 API 数据安全/隐私保护
Apifox 与 Apipost 的 API 文档引擎对比:底层架构、性能与可扩展性分析
深入探索市场上两大主流API工具——Apifox和Apipost的文档能力时,发现了令人惊讶的差距。这不仅仅是功能多寡的问题,更关乎开发效率与团队协作的质变。
|
9月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
5月前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
8月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
8月前
|
存储 缓存 分布式计算
高内存场景必读!阿里云r7/r9i/r8y/r8i实例架构、性能、价格多维度对比
阿里云针对高性能需求场景,一般会在活动中推出内存型r7、内存型r9i、内存型r8y和内存型r8i这几款内存型实例规格的云服务器。相比于活动内的经济型e和通用算力型u1等实例规格,这些内存型实例在性能上更为强劲,尤其适合对内存和计算能力有较高要求的应用场景。这些实例规格的云服务器在处理器与内存的配比上大多为1:8,但它们在处理器架构、存储性能、网络能力以及安全特性等方面各有千秋,因此适用场景也各不相同。本文将为大家详细介绍内存型r7、r9i、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
8月前
|
存储 关系型数据库 测试技术
拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)
本文深入解析PostgreSQL分区表的核心原理与优化策略,涵盖性能痛点、实战案例及压测对比。首先阐述分区表作为继承表+路由规则的逻辑封装,分析分区裁剪失效、全局索引膨胀和VACUUM堆积三大性能杀手,并通过电商订单表崩溃事件说明旧分区维护的重要性。接着提出四维设计法优化分区策略,包括时间范围分区黄金法则与自动化维护体系。同时对比局部索引与全局索引性能,展示后者在特定场景下的优势。进一步探讨并行查询优化、冷热数据分层存储及故障复盘,解决分区锁竞争问题。
1078 2
|
10月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多