0Pricing
SQL Academy · レッスン

遅いクエリの特定と修正

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. EXPLAINとEXPLAIN ANALYZEの読み方
  2. シーケンシャルスキャンとインデックススキャン
  3. Hash Join、Merge Join、Nested Loop
  4. 遅いクエリの特定と修正
← SQL Academyに戻る