PostgreSQL 13: 系统视图pg_stat_activity新增leader_pid字段显示父进程信息

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
2
3
4
5
6
leader_pid integer

Process ID of the parallel group leader if this process is or has been involved in parallel query, or null.
This field is set when a process wants to cooperate with parallel workers, and remains set as long as the process exists.
For a parallel group leader, this field is set to its own process ID.
For a parallel worker, this field is set to the process ID of the parallel group leader.

对于并行操作的父进程,leader_pid显示为该进程的进程号,对于并行操作的子进程,则显示并行操作父进程的进程号。

计划对以下两种并行场景进行演示:

  • 场景一: 并行创建索引
  • 场景二: 并行查询

环境准备

创建测试表,并插入数据,如下:

1
2
CREATE 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
2
SET max_parallel_maintenance_workers =4;
CREATE INDEX idx_big_ctime ON big USING BTREE(ctime);

会话2: 监控pg_stat_activity的活动会话,如下:

1
2
3
4
5
6
postgres=# 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
2
SET max_parallel_maintenance_workers =4;
SELECT COUNT(*) FROM big;

会话2: 监控pg_stat_activity的活动会话,如下:

1
2
3
4
5
6
7
postgres=# 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为并行查询的父进程。

参考

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

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

PostgreSQL实战
感谢支持!
0%