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

特性提交日志
为管道 / 文件 / 外部程序模式下的 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_READ和COPY_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