【初心者でもわかる】クエリプランナーとは?SQLの速度を劇的に改善する仕組みと使い方を徹底解説
データベースを扱うプログラマーやSEであれば、一度はこんな経験をしたことがあるのではないでしょうか。
- SQLは正しいのに、なぜか処理が遅い
- 同じクエリなのに環境によって速度が違う
- インデックスを貼ったのに速くならない
私自身、システム開発の現場で何度もこうした問題にぶつかりました。
そしてその原因の多くは「クエリプランナー」という仕組みに関係していました。
クエリプランナーは、データベースがSQLを実行するときにどの方法でデータを取りに行くかを決める頭脳のような存在です。
この仕組みを理解すると、次のようなメリットがあります。
- SQLの速度改善ができるようになる
- インデックス設計がうまくなる
- パフォーマンス問題の原因を特定できる
本記事では、プログラマーやSEの方へ向けてクエリプランナーの仕組み・使い方・現場で役立つ応用テクニックまで詳しく解説します。
クエリプランナーとは何か
クエリプランナーとは、データベースがSQLを実行するときに最も効率の良い実行方法を決める仕組みのことです。
SQLを書くとき、私たちは次のような形でデータを取得します。
SELECT * FROM users WHERE id = 100;
このSQLは一見とてもシンプルです。
しかしデータベース内部では、次のような判断が行われています。
- テーブルを全部読むか?
- インデックスを使うか?
- どの順番で結合するか?
- どの検索アルゴリズムを使うか?
この実行方法の計画を作るのがクエリプランナーです。
つまりSQLは「何を取得するか」を書くものですが、
「どう取得するか」はデータベースが決めているのです。
なぜクエリプランナーが重要なのか
クエリプランナーが重要な理由は非常にシンプルです。
実行計画が変わるだけでSQLの速度は何十倍も変わるからです。
例えば次の2つの方法を想像してください。
- 100万件のデータを全部読む
- インデックスを使って1件だけ探す
当然、後者のほうが圧倒的に速くなります。
しかしインデックスがあっても、クエリプランナーがそれを使わない場合があります。
つまりSQLチューニングとは、実はクエリプランナーに正しい判断をさせる作業
クエリプランナーが決めていること
クエリプランナーは主に次のようなことを判断しています。
1 テーブルアクセス方法
- フルスキャン(全件読み込み)
- インデックススキャン
- インデックスオンリースキャン
どの方法が最も効率的かを判断します。
2 JOINの順番
複数テーブルをJOINする場合、結合順序によって処理量が大きく変わります。
例
users
orders
products
この3つを結合するとき、どの順番で処理するかを決めるのもクエリプランナーです。
3 使用するアルゴリズム
JOINのアルゴリズムも複数あります。
- Nested Loop Join
- Hash Join
- Merge Join
どれが最も速いかをデータ量から推測して決めます。
クエリプランナーを見る方法(EXPLAIN)
クエリプランナーの判断を見るにはEXPLAINを使います。
EXPLAIN
SELECT * FROM users WHERE id = 100;
すると次のような実行計画が表示されます。
Index Scan using users_pkey
これは
「主キーインデックスを使って検索する」
という意味です。
つまりEXPLAINを見ることで、
- インデックスが使われているか
- フルスキャンになっていないか
- JOIN方法は何か
といった情報を確認できます。
【体験談】私がクエリプランナーで救われた話
私がクエリプランナーの重要性を痛感した出来事があります。
ある業務システムで、検索画面の表示が15秒かかる問題がありました。
SQL自体はそれほど複雑ではありません。
SELECT *
FROM orders
WHERE customer_id = ?
しかもcustomer_idにはインデックスがありました。
「なぜ遅いんだろう?」と不思議に思い、EXPLAINを実行してみました。
すると驚いたことに
Seq Scan(全件検索)
になっていたのです。
つまりデータベースは
「インデックスを使うより全部読むほうが速い」
と判断していたわけです。
原因は統計情報の古さでした。
統計を更新すると、実行計画が変わり
- 15秒 → 0.2秒
まで改善しました。
この経験で私は
SQLだけではなく、実行計画を見ることが重要
だと学びました。
クエリプランナーを知るメリット
1 パフォーマンス問題を特定できる
遅いSQLの原因は大きく3つです。
- SQLの書き方
- インデックス不足
- 実行計画
クエリプランナーを見ることで、どこに問題があるかを判断できます。
2 インデックス設計がうまくなる
実行計画を理解すると、
- どのカラムにインデックスが必要か
- 複合インデックスが必要か
が分かるようになります。
3 無駄な最適化をしなくて済む
SQLを書き換えなくても、実行計画が変わるだけで高速化することがあります。
つまりクエリプランナーを理解すると効率的にチューニング
応用編:クエリプランナーを味方につけるテクニック
1 統計情報を更新する
クエリプランナーは統計情報を元に判断しています。
統計が古いと、誤った実行計画になります。
ANALYZE;
これを実行するだけで改善するケースは非常に多いです。
2 WHERE条件の書き方を工夫する
例えば次のSQL。
WHERE YEAR(created_at) = 2024
これはインデックスが使えません。
代わりに
WHERE created_at >= '2024-01-01'
AND created_at < '2025-01-01'
と書くとインデックスが使われます。
3 不要なSELECT *を避ける
必要なカラムだけ取得することで
- I/O削減
- インデックスオンリー検索
が可能になります。
さらに上級者向け:実行計画を読む力をつける
クエリプランナーを深く理解すると、次のことができるようになります。
- 実行計画からボトルネックを特定
- JOIN順序の最適化
- 複合インデックス設計
これはデータベースエンジニアだけでなく、
アプリケーションエンジニアにも非常に価値のあるスキル
です。
なぜなら、パフォーマンス問題の多くはSQLレイヤー
まとめ:クエリプランナーを理解するとSQLはもっと速くなる
クエリプランナーは、SQLの裏側で動くデータベースの頭脳
この仕組みを理解すると次のようなメリットがあります。
- SQLのパフォーマンス改善ができる
- インデックス設計がうまくなる
- 遅い原因を特定できる
そして何より大切なのは、
SQLは書いたら終わりではない
ということです。
実際にどのように実行されるかを見ることで、データベースの理解は一気に深まります。
もしまだEXPLAINを使ったことがない方は、ぜひ一度試してみてください。
きっとデータベースの見え方が変わるはずです。
