遅いクエリの特定と修正
pg_stat_statements、log_min_duration_statement、EXPLAINを使って遅いクエリを見つけ、的を絞った修正を行います。
「遅いクエリの特定と修正」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
ステップ 1:遅いクエリを見つける
勘だけで最適化してはいけません。次のツールを使用します。
pg_stat_statements— 合計時間が長い順にクエリを確認しますlog_min_duration_statement— しきい値を超えたクエリをログに記録します- pgBadger — ログから見やすいレポートを作成します
pg_stat_statements の設定
拡張機能を有効にし、shared_preload_libraries を設定します。
-- postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
-- After restart:
CREATE EXTENSION pg_stat_statements;負荷の高いクエリのトップ 10
DBA にとって最も役立つクエリです。
SELECT query,
calls,
total_exec_time,
mean_exec_time,
rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;遅いクエリをログに記録する
しきい値を設定し、ログを確認します。
-- postgresql.conf
log_min_duration_statement = '500ms'
-- All queries running > 500ms are logged.ステップ 2:EXPLAIN ANALYZE で再現する
遅いクエリごとに、実際の環境に近いデータを使った環境で EXPLAIN ANALYZE を実行します。次の点を確認します。
- 実測時間が最も大きいノード
- 推定行数と実際の行数の差が最も大きい箇所
- 適切なインデックスが使用されているか
一般的な修正方法
- WHERE 句または JOIN 句の列にインデックスがない — インデックスを追加します
- sargable でない述語(列に対する関数) — 式インデックスを追加するか、書き換えます
- 古い統計情報 — ANALYZE を実行します
- 誤ったデータ型(暗黙のキャストが発生) — 列の型を修正します
- OR 条件 — 単一条件のクエリを UNION にまとめる形に書き換えます
- SELECT * で取得量が多い — 取得する列を絞ります
古い統計情報
推定行数と実際の行数が大きく異なる場合は、まず ANALYZE を実行します。
ANALYZE orders;
-- Or rely on autovacuum to do it periodically.インデックスの健全性チェック
テーブル上のインデックスと、そのサイズを一覧表示します。
SELECT indexrelname, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE relname = 'orders'
ORDER BY pg_relation_size(indexrelid) DESC;未使用のインデックス
一度も使用されていないインデックスを見つけます。
SELECT schemaname, relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;
-- Consider dropping them — they slow writes for no read benefit.ロック競合
クエリが「遅い」のは、ロックの解放を待っているためかもしれません。pg_stat_activity の wait_event を確認します。
SELECT pid, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state <> 'idle';クエリの書き換えパターン
- フィルターを WHERE 句に移します
- SELECT 内の相関サブクエリを JOIN + GROUP BY に置き換えます
- OR を、インデックスを使うクエリの UNION ALL に置き換えます
- 自己結合の代わりにウィンドウ関数を使用します
- 繰り返し使用するサブクエリを CTE でマテリアライズします(Planner が適切に判断できない場合)
繰り返す
パフォーマンスチューニングは、測定 → 仮説を立てる → 変更する → 測定する、というループです。推測で進めてはいけません。
まとめ
pg_stat_statements で遅いクエリを見つけ、EXPLAIN ANALYZE で原因を調べ、インデックス、ANALYZE、クエリの書き換えで修正し、改善を繰り返します。
確認問題
合計実行時間が長いクエリを上位から確認できる PostgreSQL の拡張機能はどれですか。
よくある質問
「遅いクエリの特定と修正」レッスンは無料ですか?
はい。「遅いクエリの特定と修正」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「遅いクエリの特定と修正」で何を学びますか?
pg_stat_statements、log_min_duration_statement、EXPLAINを使って遅いクエリを見つけ、的を絞った修正を行います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「遅いクエリの特定と修正」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。