クエリ最適化・実行計画 くえりさいてきか・じっこうけいかく
EXPLAINインデックスクエリプランナーパフォーマンスチューニングSQLシーケンシャルスキャン
クエリ最適化・実行計画について教えて
クエリ最適化・実行計画とは
**クエリ最適化(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 | テーブル結合の方法 |
主なスキャン方式の比較
歴史と背景
- 1979年:System R(IBMの実験的RDBMS)でコストベースオプティマイザが最初に実装される
- 1986年:SQL標準化によりオプティマイザの重要性が業界全体で認識される
- 1990年代:Oracle・IBM DB2が高度なコストベースオプティマイザを商用実装。テーブル統計情報(行数・カーディナリティ)を使ったコスト見積もりが主流に
- 2000年代:PostgreSQL がルールベースからコストベースオプティマイザへ完全移行
- 現在:機械学習を活用したAIオプティマイザ(予測精度の改善)の研究が進む。クラウドDB(BigQuery等)は自動的にリソース配分を最適化
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| ISO/IEC 9075 | EXPLAIN は標準化されておらず製品独自の拡張(PostgreSQL/MySQL/Oracle等) |
関連用語
- インデックス — 検索を高速化するための索引構造
- 複合インデックス — 複数カラムを組み合わせたインデックス
- パーティショニング — テーブルを分割して管理・検索効率を上げる技術
- マテリアライズドビュー — クエリ結果を実体として保存する高速化技術
- ビュー — 複雑なSELECTクエリに名前をつけて仮想テーブルとして扱う機能
- バキューム・VACUUM — 統計情報も更新するPostgreSQLの管理機能
- コネクションプール — DB接続を再利用して効率化する仕組み