テック技報最新号へ →
コード

Postgres: EXPLAIN (ANALYZE, BUFFERS) で「なぜ遅いか」を見る

EXPLAIN ANALYZE は実測の時間と行数を出す。BUFFERS を足すとページをどこから読んだかが分かり、遅さがディスク I/O なのか CPU なのかを切り分けられる。

@amitsinha__07 · 投稿 2026-11-08
#postgres#performance#explain#infra

いつ使うか

遅いクエリを調べるとき、プランの形(Seq Scan か Index Scan か)だけでなく、「推定と実際の行数のずれ」と「読んだページ数」まで確かめたいとき。

やり方

sql
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at DESC LIMIT 20;

見るところ:

注意点

  • EXPLAIN ANALYZE はクエリを本当に実行する。UPDATE / DELETE / INSERT に付けるとデータが変わるので、トランザクションで包んで戻す:
    sql
    BEGIN;
    EXPLAIN (ANALYZE, BUFFERS) DELETE FROM sessions WHERE expires_at < now();
    ROLLBACK;
  • 1 回目はキャッシュが冷えていて read が多く出やすい。2 回目以降と比べて判断する。
  • Postgres 18 以降は EXPLAIN ANALYZE で BUFFERS が既定で付く。それより前の版では明示が必要。
  • 本番で重いクエリを ANALYZE 付きで流すと、その分の負荷がかかる。

出典

X の元の投稿を開く