実行計画入門

実行計画入門:遅いSQLを直す前に「何が重いか」を見る

この記事で分かること

  • 「なぜ遅いのか」を勘で当てにせず、DBが実際にどう実行しているかを確認できる
  • 実行計画(EXPLAIN)の見方の基本が分かる
  • 「どの表のアクセスが重いか」「インデックスが効いているか」を判断する入口が持てる

結論:書き換えの前に実行計画を見る

遅いSQLを闇雲に書き換えても、原因が違えば速くなりません。まず実行計画で「どの処理に時間がかかっているか」を確認し、その部分(フルスキャン・重いJOIN・ソートなど)を狙って直すのが基本です。

最小例:EXPLAIN を出す

DBMSによって構文が少し違いますが、多くの場合 EXPLAIN(または
EXPLAIN ANALYZE)で計画と実測が得られます。

-- PostgreSQL の例
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 123;

-- MySQL の例
EXPLAIN SELECT * FROM orders WHERE customer_id = 123;
  • Seq Scan / Full Table Scan: 表全体を読んでいる → 条件に合う列にインデックスがあるか確認
  • Index Scan / Index Range Scan: インデックスを使って絞り込んでいる → 期待どおり
  • Nested Loop / Hash Join: 結合のやり方。行数が多くなっていないか確認

どこを直すかの当たりの付け方

  • rows(見積もり行数)が極端に大きい → その段階で絞り込めていない
  • 実際の実行時間が長いステップ → その処理(スキャン・JOIN・Sort)を減らす・インデックスを検討
  • インデックスが使われていない → WHERE / JOIN の条件とインデックスの列の順序・型を確認

よくあるミス

  • 実行計画を見ずに「とりあえずサブクエリをJOINに変えた」などで終わる
  • 1回だけ実行してキャッシュの影響を見ていない(複数回・本番に近いデータ量で確認)

練習問題(2問)

  1. 手元のDBで、簡単な SELECT に EXPLAIN を付けて実行し、「どのスキャンになっているか」を読む
  2. WHERE の条件列にインデックスを付けて、計画が「Index Scan」などに変わるか確認する

次に読む

タイトルとURLをコピーしました