データベース操作・制御

クエリ最適化・実行計画 くえりさいてきか・じっこうけいかく

EXPLAINインデックスクエリプランナーパフォーマンスチューニングSQLシーケンシャルスキャン
クエリ最適化・実行計画について教えて

簡単に言うとこんな感じ!

クエリ最適化は「DBが自動でSQLの最速ルートを選ぶ」仕組みだよ! カーナビが渋滞を避けるルートを自動で選ぶみたいに、DBエンジンも「どの順番でテーブルを結合するか」「インデックスを使うか」を自動判断する。その経路を見える化したのが「実行計画」なんだ!


クエリ最適化・実行計画とは

**クエリ最適化(Query Optimization)とは、SQLクエリを受け取ったDBMSが、同じ結果を得るための複数の実行方法の中から最も効率的な方法を選択するプロセスです。この最適化を担うコンポーネントをクエリオプティマイザ(クエリプランナー)**と呼びます。

実行計画(Execution Plan / Query Plan)とは、オプティマイザが選択した「このSQLをどうやって実行するか」の具体的な手順書です。「どのテーブルをどの順番でスキャンするか」「インデックスを使うか全件スキャンするか」「テーブルの結合方法はNested Loop・Hash Join・Merge Joinのどれか」などが記録されています。

SQLのパフォーマンス問題の診断は実行計画の確認から始まります。EXPLAINコマンドを使うことで実行計画を可視化でき、「インデックスが使われていない」「予想より多い行を読んでいる」といった問題箇所を特定できます。


実行計画の確認方法

-- 実行計画を表示(PostgreSQL / MySQL共通)
EXPLAIN SELECT * FROM orders WHERE customer_id = 123;

-- 実際に実行して時間も計測(PostgreSQL)
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 123;

実行計画の読み方(PostgreSQL例)

Seq Scan on orders  (cost=0.00..1850.00 rows=50000 width=64)
  Filter: (customer_id = 123)
要素意味
Seq Scanテーブル全件スキャン(遅い。インデックスなし)
Index Scanインデックスを使ったスキャン(速い)
cost=0.00..1850.00最初の行を返すコスト .. 全行返すコストの見積もり
rows=50000返すと予測している行数
Hash Join / Nested Loopテーブル結合の方法

主なスキャン方式の比較

スキャン方式の使い分け Seq Scan テーブル全件スキャン 条件に合う行を探して 全ページを順次読む 大テーブルでは遅い Index Scan B-treeインデックスで 対象行を特定してから ヒープ(本体)へアクセス 少数行取得に最速 Bitmap Index Scan インデックスでビットマップを 生成→まとめてページ読取 複数条件のOR/AND合成も可能 中規模の結果セットに有効 パフォーマンス改善の基本手順 ① EXPLAIN ANALYZEで実行計画確認 → ② Seq Scanが遅い場合はインデックス追加 → ③ 再度確認

歴史と背景

  • 1979年:System R(IBMの実験的RDBMS)でコストベースオプティマイザが最初に実装される
  • 1986年:SQL標準化によりオプティマイザの重要性が業界全体で認識される
  • 1990年代:Oracle・IBM DB2が高度なコストベースオプティマイザを商用実装。テーブル統計情報(行数・カーディナリティ)を使ったコスト見積もりが主流に
  • 2000年代:PostgreSQL がルールベースからコストベースオプティマイザへ完全移行
  • 現在機械学習を活用したAIオプティマイザ(予測精度の改善)の研究が進む。クラウドDB(BigQuery等)は自動的にリソース配分を最適化

関連する規格・RFC

規格内容
ISO/IEC 9075EXPLAIN は標準化されておらず製品独自の拡張(PostgreSQL/MySQL/Oracle等)

関連用語