查找造成磁盘 I/O、临时文件和 WAL 的查询(pg_stat_statements)
PostgreSQL性能命令
SELECT queryid,
calls,
shared_blks_hit,
shared_blks_read,
round(100.0 * shared_blks_hit / NULLIF(shared_blks_hit + shared_blks_read, 0), 1) AS hit_pct,
pg_size_pretty(temp_blks_written * current_setting('block_size')::bigint) AS temp_written,
pg_size_pretty(wal_bytes) AS wal,
left(regexp_replace(query, '\s+', ' ', 'g'), 120) AS query
FROM pg_stat_statements
ORDER BY shared_blks_read + temp_blks_read + temp_blks_written DESC
LIMIT 20;作用
显示从 shared buffers 之外读取块最多、写入临时文件最多(无法放入 work_mem 的排序/哈希)以及生成 WAL 最多的查询,并给出其缓存命中率。
适用场景
当磁盘读延迟上升、出现临时文件告警(log_temp_files)或 WAL 量突然增长时,用于找出责任查询。
注意
shared_blks_read 也会计入由操作系统页缓存提供的读取;真实的磁盘时间需要 track_io_timing = on(先用 pg_test_timing 测量其开销)。如果 temp_written 很高,通常的解决方法是按角色/会话调高 work_mem 或修复查询/索引;全局调高 work_mem 会增加内存风险。