PostgreSQL 17: 系统视图 pg_wait_events

John Doe 六月 5, 2025

你需要经常查看数据库中的等待事件吗?那么,你知道 PostgreSQL 中某个等待事件的含义吗?

在山坡漫步的大象

特性提交日志

添加系统视图 pg_wait_events。

这是一个使用集合返回函数构建的视图,它展示了有关等待事件的以下信息:

  • 名称
  • 类型(Activity、I/O、Extension 等)
  • 描述

所有检索到的信息均来自wait_event_names.txt,且描述内容与文档中的一致,但会过滤掉所有 XML 标记。当此视图与pg_stat_activity联用时,可用于获取所报告等待事件的描述,非常实用。

该视图还包含了为扩展程序定义的自定义等待事件。

讨论https://postgr.es/m/0e2ae164-dc89-03c3-cf7f-de86378053ac@gmail.com

示例

PostgreSQL 新版本引入了一个名为pg_wait_events的系统视图。顾名思义,该视图列出了 PostgreSQL 已知的等待事件。自从 PostgreSQL 9.6 在pg_stat_activity视图中引入“wait_event_type”和“wait_event”列以来,陆续出现了许多此类的等待事件。

到目前为止,您要么必须转到文档,来获取等待事件的完整列表,要么可以查看源代码中的wait_event_names.txt

$ find . -name wait_event_names.txt
./src/backend/utils/activity/wait_event_names.txt
$ head -10 ./src/backend/utils/activity/wait_event_names.txt
#
# wait_event_names.txt
#      PostgreSQL wait events
#
# Copyright (c) 2024, PostgreSQL Global Development Group
#
# This list serves as the basis for generating source and documentation files
# related to wait events.
#
# The files generated from this one are:

事实上,pg_wait_events就是从这个文本文件中获取内容的,所以这就是最终的来源。从视图本身来看,它非常简单:

postgres=# \d pg_wait_events 
          View "pg_catalog.pg_wait_events"
   Column    | Type | Collation | Nullable | Default
-------------+------+-----------+----------+---------
 type        | text |           |          | 
 name        | text |           |          | 
 description | text |           |          | 

等待事件有类型、名称和描述:

select * from pg_wait_events limit 5;
   type   |       name        |                     description                     
----------+-------------------+-----------------------------------------------------
 Activity | ArchiverMain      | Waiting in main loop of archiver process
 Activity | AutoVacuumMain    | Waiting in main loop of autovacuum launcher process
 Activity | BgWriterHibernate | Waiting in background writer process, hibernating
 Activity | BgWriterMain      | Waiting in main loop of background writer process
 Activity | CheckpointerMain  | Waiting in main loop of checkpointer process
(5 rows)

除了可以直接在 PostgreSQL 内部访问等待事件的描述之外,该视图本身可能没什么用。如果将其与 pg_stat_activity 连接起来,它会更有用。为了了解它是怎么用的,让我们在第一个会话中生成一个等待事件:

begin;

select * from t;

在第二个会话中,将pg_stat_activitypg_wait_events连接起来,您将在 description 列中看到等待事件的完整描述,这非常方便,因为它为您提供了有关等待事件的更多信息:

select a.datname, a.usename, a.state, a.wait_event_type, a.wait_event, b.description 
  from pg_stat_activity a 
  join pg_wait_events b 
    on a.wait_event_type = b.type 
   and a.wait_event = b.name;
 datname  | usename  |        state        | wait_event_type |     wait_event      |                         description
----------+----------+---------------------+-----------------+---------------------+--------------------------------------------------------------
          |          |                     | Activity        | ArchiverMain        | Waiting in main loop of archiver process
          |          |                     | Activity        | AutoVacuumMain      | Waiting in main loop of autovacuum launcher process
          |          |                     | Activity        | BgWriterHibernate   | Waiting in background writer process, hibernating
          |          |                     | Activity        | CheckpointerMain    | Waiting in main loop of checkpointer process
          | postgres |                     | Activity        | LogicalLauncherMain | Waiting in main loop of logical replication launcher process
          |          |                     | Activity        | WalWriterMain       | Waiting in main loop of WAL writer process
 postgres | postgres | idle in transaction | Client          | ClientRead          | Waiting to read data from the client
(7 rows)

非常不错的体验,感谢所有参与的社区人员。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/1e68e43d3f0ff1dcf4a5926f9d6336b86bda034d