DBAtlas · 数据库运维图谱

查找造成磁盘 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 会增加内存风险。

在 DBAtlas 中打开 →

相关内容