PostgreSQL 11 新特性解读:支持并行哈希连接(Parallel Hash Joins)"

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:

PostgreSQL 11 版本在并行方面得到增强,例如支持并行创建索引(Parallel Index Build)、并行哈希连接(Parallel Hash Join)、并行 CREATE TABLE .. AS等,上篇博客介绍了并行创建索引,本文介绍并行 Hash Join。

测试环境准备

创建大表t_big并插入5000万条数据。

CREATE TABLE t_big(
id int4,
name text,
create_time timestamp without time zone );

INSERT INTO t_big(id,name,create_time)
SELECT n, n|| '_test',clock_timestamp() FROM generate_series(1,50000000) n ;

创建小表t_small并插入800万条数据

CREATE TABLE t_small(id int4, name text);

INSERT INTO t_small(id,name)
SELECT n, n|| '_small' FROM generate_series(1,8000000) n ;

验证并行哈希连接

PostgreSQL 10 版本查看以下SQL执行计划,如下:

des=> EXPLAIN SELECT t_small.name
  FROM t_big JOIN t_small ON (t_big.id = t_small.id)
       AND t_small.id < 100;
                                      QUERY PLAN
--------------------------------------------------------------------------------------
 Gather  (cost=151870.58..661385.28 rows=4143 width=13)
   Workers Planned: 4
   ->  Hash Join  (cost=150870.58..659970.98 rows=1036 width=13)
         Hash Cond: (t_big.id = t_small.id)
         ->  Parallel Seq Scan on t_big  (cost=0.00..470246.58 rows=10358258 width=4)
         ->  Hash  (cost=150860.58..150860.58 rows=800 width=17)
               ->  Seq Scan on t_small  (cost=0.00..150860.58 rows=800 width=17)
                     Filter: (id < 100)
(8 rows)

PostgreSQL 11 版本查看以下SQL执行计划,如下:

francs=> EXPLAIN SELECT t_small.name
  FROM t_big JOIN t_small ON (t_big.id = t_small.id)
       AND t_small.id < 100;
                                       QUERY PLAN
-----------------------------------------------------------------------------------------
 Gather  (cost=76862.42..615477.60 rows=800 width=13)
   Workers Planned: 4
   ->  Parallel Hash Join  (cost=75862.42..614397.60 rows=200 width=13)
         Hash Cond: (t_big.id = t_small.id)
         ->  Parallel Seq Scan on t_big  (cost=0.00..491660.86 rows=12499686 width=4)
         ->  Parallel Hash  (cost=75859.92..75859.92 rows=200 width=17)
               ->  Parallel Seq Scan on t_small  (cost=0.00..75859.92 rows=200 width=17)
                     Filter: (id < 100)
(8 rows)

对比10版本的执行计划,不同之处为11版本走了 Parallel Hash Join,而 10 版本走的 Hash JoinParallel Hash Join 为 11 版本的新特性。

并行哈希连接性能测试

开启并行哈希连接相比不开启性能上有何变化?接着测试。

开启并行哈希连接

PostgreSQL 11 版本执行以下SQL,如下:

francs=> EXPLAIN ANALYZE SELECT t_small.name
  FROM t_big JOIN t_small ON (t_big.id = t_small.id)
       AND t_small.id < 100;
                                                                QUERY PLAN

------------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=76862.42..615477.60 rows=800 width=13) (actual time=197.399..2738.010 rows=99 loops=1)
   Workers Planned: 4
   Workers Launched: 4
   ->  Parallel Hash Join  (cost=75862.42..614397.60 rows=200 width=13) (actual time=2222.347..2729.943 rows=20 loops=5)
         Hash Cond: (t_big.id = t_small.id)
         ->  Parallel Seq Scan on t_big  (cost=0.00..491660.86 rows=12499686 width=4) (actual time=0.038..1330.836 rows=10000000 loops=5)
         ->  Parallel Hash  (cost=75859.92..75859.92 rows=200 width=17) (actual time=191.484..191.484 rows=20 loops=5)
               Buckets: 1024  Batches: 1  Memory Usage: 40kB
               ->  Parallel Seq Scan on t_small  (cost=0.00..75859.92 rows=200 width=17) (actual time=152.436..191.385 rows=20 loops=5)
                     Filter: (id < 100)
                     Rows Removed by Filter: 1599980
 Planning Time: 0.183 ms
 Execution Time: 2738.068 ms
(13 rows)

以上SQL执行多次,取最快时间,执行时间为 2738.068 ms。

关闭并行哈希连接

会话级设置enable_parallel_hash参数为off表示关闭并行哈希连接,测试性能有何变化,如下。

francs=> set enable_parallel_hash = off;
SET

francs=> EXPLAIN ANALYZE SELECT t_small.name
  FROM t_big JOIN t_small ON (t_big.id = t_small.id)
       AND t_small.id < 100;
                                                                QUERY PLAN

------------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=151869.66..690486.34 rows=800 width=13) (actual time=996.137..3496.940 rows=99 loops=1)
   Workers Planned: 4
   Workers Launched: 4
   ->  Hash Join  (cost=150869.66..689406.34 rows=200 width=13) (actual time=2990.847..3490.557 rows=20 loops=5)
         Hash Cond: (t_big.id = t_small.id)
         ->  Parallel Seq Scan on t_big  (cost=0.00..491660.86 rows=12499686 width=4) (actual time=0.240..1392.062 rows=10000000 loops=5)
         ->  Hash  (cost=150859.66..150859.66 rows=800 width=17) (actual time=890.943..890.943 rows=99 loops=5)
               Buckets: 1024  Batches: 1  Memory Usage: 13kB
               ->  Seq Scan on t_small  (cost=0.00..150859.66 rows=800 width=17) (actual time=884.288..890.906 rows=99 loops=5)
                     Filter: (id < 100)
                     Rows Removed by Filter: 7999901
 Planning Time: 0.154 ms
 Execution Time: 3496.982 ms
(13 rows)

以上SQL执行多次,取最快时间,从以上看出,关闭并行哈希连接时SQL的执行时间为 3496.982 ms ,相比开启并行哈希连接执行时间长了 27%。

可见开启并行哈希连接后,性能有较大幅度提升。

参考

新书推荐

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html
_5_PostgreSQL_

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
14天前
|
关系型数据库 分布式数据库 数据库
PolarDB for PostgreSQL报错问题之psql连接数据库报错如何解决
PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。
|
28天前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
【1月更文挑战第21天】【1月更文挑战第105篇】PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
24 1
|
1月前
|
关系型数据库 分布式数据库 PolarDB
在 Flask 中连接 OceanBase 或 PolarDB
在 Flask 中连接 OceanBase 或 PolarDB【1月更文挑战第12天】【1月更文挑战第59篇】
80 6
|
2月前
|
SQL 关系型数据库 分布式数据库
深度解析PolarDB数据库并行查询技术
深度解析PolarDB数据库并行查询技术:加速SQL执行的关键问题和核心技术 随着数据规模的不断扩大,用户SQL的执行时间越来越长,这不仅对数据库的优化能力提出更高的要求,并且对数据库的执行模式也提出了新的挑战。为了解决这个问题,许多数据库系统,包括Oracle、SQL Server等,都开始提供并行查询引擎的支持,以充分利用系统资源,达到加速SQL执行的效果。本文将深入探讨基于代价进行并行优化、并行执行的云数据库的并行查询引擎的关键问题和核心技术。
99 2
|
2月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版并行查询技术探索与实践
PolarDB MySQL版并行查询技术探索与实践 PolarDB MySQL版在企业级查询加速特性上进行了深度技术探索,其中并行查询作为其重要组成部分,已经在线稳定运行多年,持续演进。本文将详细介绍并行查询的背景、挑战、方案、特性以及实践。
88 2
|
3月前
|
关系型数据库 PostgreSQL
解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
207 0
|
3月前
|
消息中间件 存储 关系型数据库
PostgreSQL技术大讲堂 - 第33讲:并行查询管理
PostgreSQL从小白到专家,技术大讲堂 - 第33讲:并行查询管理
276 1
|
3月前
|
关系型数据库 数据库 数据安全/隐私保护
使用脚手架Scaffold-DbContext连接(SqlServer和PostgreSQL)
【代码】使用脚手架Scaffold-DbContext连接(SqlServer和PostgreSQL)
42 0
|
3月前
|
SQL 关系型数据库 数据库
postgresql中连接两张表更新第三张表(updata)
如何结合两张表的数据来更新第三张表
36 0
|
5月前
|
关系型数据库 PostgreSQL 索引
PostgreSQL技术大讲堂 - 第30讲:多表连接方式
从零开始学PostgreSQL技术大讲堂 - 第30讲:多表连接方式
257 2