pg_stat_statements 為 PostgreSQL 核心擴充套件,自動追蹤所有 SQL 執行統計 (呼叫次數、總耗時、平均耗時、資料列數、快取命中率、共享緩衝區讀寫等),是查詢效能調優、發現慢查詢的核心工具。
cd /home/postgres/postgresql-9.3.2/contrib/pg_stat_statements
make && make install
成功後,`$PGHOME/share/extension/` 下會出現 `pg_stat_statements--1.1.sql` 等控制檔。
CREATE EXTENSION pg_stat_statements;
# 必須:預載入共享庫,需重啟生效
shared_preload_libraries = 'pg_stat_statements'
# 選項:最大追蹤陳述式數 (預設 5000,依工作負載調大)
pg_stat_statements.max = 10000
# 選項:追蹤層級
# top - 僅最上層陳述式 (預設)
# all - 包含巢狀函數/觸發器內部陳述式
# none - 停用
pg_stat_statements.track = all
# 9.3+ 不再需要 custom_variable_classes 參數
修改後必須重啟 PostgreSQL 服務 使 `shared_preload_libraries` 生效。
| 欄位 | 含義 |
|---|---|
| userid, dbid, queryid | 使用者/資料庫/查詢唯一識別碼 (queryid 為查詢正規化後雜湊) |
| query | 正規化後查詢文本 (常數替換為 $1, $2...) |
| calls | 呼叫次數 |
| total_time | 總耗時 (毫秒) |
| mean_time | 平均耗時 |
| rows | 總回傳/影響資料列數 |
| shared_blks_hit/read/dirtied/written | 共享緩衝區命中/讀取/髒頁/寫入區塊數 |
| local_blks_*, temp_blks_* | 區域/臨時緩衝區同類指標 |
| blk_read_time, blk_write_time | 區塊讀寫耗時 (需啟用 `track_io_timing = on`) |
SELECT queryid, calls, total_time, mean_time, rows,
substring(query, 1, 200) AS short_query
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
SELECT queryid, calls, mean_time, total_time,
substring(query, 1, 200) AS short_query
FROM pg_stat_statements
WHERE calls > 100
ORDER BY mean_time DESC
LIMIT 10;
SELECT queryid,
shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_ratio,
calls, mean_time
FROM pg_stat_statements
WHERE shared_blks_hit + shared_blks_read > 1000
ORDER BY hit_ratio ASC
LIMIT 20;