PostgreSQL已支持并行创建索引、并行查询、并行VACUUM
等并行操作,PostgreSQL 13 版本的系统视图pg_stat_activity新增leader_pid字段,可以显示父进程号,本文简单演示下。
发行说明
Add leader_pid to pg_stat_activity to report parallel worker ownership (Julien Rouhaud)
Leader_pid 说明
pg_stat_activity.leader_pid
字段手册说明如下:
1 | leader_pid integer |
对于并行操作的父进程,leader_pid显示为该进程的进程号,对于并行操作的子进程,则显示并行操作父进程的进程号。
计划对以下两种并行场景进行演示:
- 场景一: 并行创建索引
- 场景二: 并行查询
环境准备
创建测试表,并插入数据,如下:1
2CREATE TABLE big(user_id int4,user_name text,ctime timestamp(6) without time zone default clock_timestamp() );
INSERT INTO big(user_id,user_name) SELECT n ,n || '_data' FROM generate_series(1,20000000) n;
场景一: 并行创建索引
会话1: 设置max_parallel_maintenance_workers=4,并创建索引,如下:1
2SET max_parallel_maintenance_workers =4;
CREATE INDEX idx_big_ctime ON big USING BTREE(ctime);
会话2: 监控pg_stat_activity的活动会话,如下:1
2
3
4
5
6postgres=# SELECT datname,pid,leader_pid,state,query FROM pg_stat_activity WHERE state='active' and usename='pguser' and pid <> pg_backend_pid();
datname | pid | leader_pid | state | query
---------+--------+------------+--------+-------------------------------------------------------
mydb | 128984 | 128984 | active | CREATE INDEX idx_big_ctime ON big USING BTREE(ctime);
mydb | 129717 | 128984 | active | CREATE INDEX idx_big_ctime ON big USING BTREE(ctime);
(2 rows)
显示了两个索引创建进程,128984为创建索引的父进程。
场景二: 并行查询
会话1: 设置max_parallel_maintenance_workers=4,并创建索引,如下:1
2SET max_parallel_maintenance_workers =4;
SELECT COUNT(*) FROM big;
会话2: 监控pg_stat_activity的活动会话,如下:1
2
3
4
5
6
7postgres=# SELECT datname,pid,leader_pid,state,query FROM pg_stat_activity WHERE state='active' and usename='pguser' and pid <> pg_backend_pid();
datname | pid | leader_pid | state | query
---------+--------+------------+--------+---------------------------
mydb | 128984 | 128984 | active | SELECT COUNT(*) FROM big;
mydb | 129820 | 128984 | active | SELECT COUNT(*) FROM big;
mydb | 129821 | 128984 | active | SELECT COUNT(*) FROM big;
(3 rows)
显示了三个并行查询进程,128984为并行查询的父进程。