PostgreSQL 19: 添加导入导出的 IO 等待事件

John Doe 二月 6, 2026

我们经常需要在 PostgreSQL 中进行导入导出操作,执行过程往往耗时很长,又无法精准定位出瓶颈以进行优化。

image

特性提交日志

为管道 / 文件 / 外部程序模式下的 COPY FROM/TO 操作新增两类 IO 等待事件

为 COPY FROM/TO 相关代码新增两类等待事件:

  • COPY_FROM_READ:从复制文件中读取数据时触发。
  • COPY_TO_WRITE:向复制文件中写入数据时触发。

在 COPY 相关代码中,当以管道模式(非远端目标场景)、外部程序模式或文件模式处理 COPY 命令,且对 COPY 的文件执行fread()fwrite()系统调用时,会初始化并启用 COPY 文件相关的等待事件标记。

特性介绍

在 PostgreSQL 中,COPY FROM/TO是高性能批量数据导入导出的关键命令,广泛用于 ETL、数据备份恢复、日志导入等场景。但在此前版本中,当COPY操作因文件读取、写入或管道传输出现 IO 等待时,相关进程的等待状态会被归类到模糊的通用 IO 事件中,DBA 无法精准判断 “慢” 是源于COPY本身的 IO 瓶颈,还是其他系统资源竞争,给性能排查带来极大困扰。

本次提交解决了这一问题:为COPY FROM/TO命令新增两个专属 IO 等待事件:COPY_FROM_READCOPY_TO_WRITE,分别标记 “数据读取” 和 “数据写入” 阶段的 IO 等待状态。这一特性让COPY操作的性能瓶颈定位从 “猜测” 变为 “精准观测”,大幅提升了批量数据处理场景的可观测性。

示例

假设我们要将 10GB 的用户行为日志 CSV 文件,通过COPY FROM导入数据库的user_behavior表。导入耗时远超预期(超过 30 分钟),DBA 需要判断是 CPU 解析瓶颈还是磁盘 IO 读取瓶颈。

执行COPY FROM命令:

COPY user_behavior (user_id, action, time, page)
FROM '/data/logs/user_202410.csv'
WITH (FORMAT csv, HEADER on);

在另一个会话中执行监控查询:

SELECT 
  pid,
  query,
  wait_event,
  wait_event_type,
  state
FROM pg_stat_activity 
WHERE query LIKE 'COPY user_behavior%';

分析监控结果:

  • wait_event持续显示COPY_FROM_READ:说明瓶颈在磁盘 IO 读取,需排查存储性能(如机械硬盘 IOPS 不足、文件系统挂载参数不合理),可以考虑采用 SSD 存储设备。
  • wait_event很少出现,进程状态多为active且无等待:说明瓶颈是 CPU 解析,需优化 CSV 格式(如减少冗余字段),或采用表分区使用多连接并行导入。

参考

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