コンテンツへスキップ
uencoder

SQL クエリの実行プランを分析する

EXPLAIN は、データベースがクエリをどのように実行するかを示します。プランの読み方を学び、ボトルネックを特定して最適化しましょう。

  1. 1

    EXPLAIN(PostgreSQL では EXPLAIN ANALYZE、MySQL では EXPLAIN WITH STATISTICS)は実行プランを表示します:スキャン方式(シーケンシャル、インデックス、ビットマップ)、結合方式(ネステッドループ、ハッシュ、マージ)、ソート方式、推定コストと行数。注目すべきは、大きなテーブルでのシーケンシャルスキャン、高コストなソート、大きな入力に対するネステッドループ結合、不正確な行数推定です。

  2. 2
    SQL フォーマッター →

    EXPLAIN を実行する前にクエリをフォーマットしましょう。読みやすいクエリは、実行プランを SQL に対応付ける作業を楽にします。また、フォーマットにより、クエリのどの部分がプラン内の高コスト操作の原因になっているかを特定しやすくなります。

  3. 3

    SQL フォーマットのワークフローを使ってクエリをフォーマット・ドキュメント化してから、フォーマット済みのバージョンに EXPLAIN を実行します。実行プランと対応付けやすい、整ったクエリが得られます。

よくある質問

EXPLAIN と EXPLAIN ANALYZE の違いは?
EXPLAIN は統計に基づく推定プランを表示します。EXPLAIN ANALYZE は実際にクエリを実行し、実際の行数、所要時間、メモリ使用量を表示します。手早い確認には EXPLAIN を、正確な診断には EXPLAIN ANALYZE を使いましょう。注意:ANALYZE はクエリを実行します。INSERT/UPDATE/DELETE に対しては、ROLLBACK 付きのトランザクションを使いましょう。
シーケンシャルスキャンとは何で、いつ問題になるの?
シーケンシャルスキャンはテーブルのすべての行を読み取ります。小さなテーブルや、ほとんどの行が一致する場合は問題ありません(インデックス参照 + 取得より速いため)。一致する行が少ない大きなテーブルでは遅くなるため、インデックスを追加しましょう。EXPLAIN の出力に「Seq Scan」と表示されたら、推定行数がテーブルの大部分を占めていないか確認してください。

このタスクを解決するワークフロー

関連ツール