データベースチューニングにおいて「どのSQLが遅いのか」だけでなく、「どの処理がボトルネックなのか」を正しく把握することは非常に重要です。
そのための基本ツールが**実行計画(EXPLAIN PLAN)**です。
本記事では、Oracleを例に実行計画の見方とボトルネックの探し方を、初心者でも理解できるように解説します。
✅ EXPLAIN PLANとは?
SQLを実行する際、Oracleが内部的に考える**最適な実行手順(アクセス方法)**を表示する機能です。
実行計画を見ることで、次のようなことがわかります。
-
テーブルにアクセスする順番
-
インデックスを使っているかどうか
-
結合(JOIN)の方式
-
フルスキャンが走っているか
-
コスト(予測負荷)
✅ 実行計画の取得方法
▼ 方法1:EXPLAIN PLAN文を使う
▼ 方法2:SQL Developer で「実行計画」ボタン
GUI環境ではワンクリックで参照できます。
✅ Oracle実行計画の基本構造
実行計画は階層構造で、上から順に処理が行われます。
インデントが深いほど「その処理の中で実行される詳細処理」です。
例:
✅ よく出るOperationと解釈ポイント
| Operation | 説明 | 見どころ |
|---|---|---|
| TABLE ACCESS FULL | テーブルの全件スキャン | 大量データで出たら要注意 |
| TABLE ACCESS BY INDEX ROWID | インデックス参照後にROWIDアクセス | 最適パターンの一つ |
| INDEX UNIQUE SCAN | 主キー・ユニークインデックス検索 | 高速 |
| INDEX RANGE SCAN | 範囲検索 | 効率的だが条件次第 |
| HASH JOIN | ハッシュ表でJOIN | 大量データ向き、メモリ消費 |
| NESTED LOOPS | 小規模データに適したJOIN | 結合相手の行数が多いと遅い |
| SORT ORDER BY | 並び替え | 必要ならOK、無駄がないか確認 |
✅ ボトルネックの探し方
① TABLE ACCESS FULL に注意
-
条件にインデックスが効いていない可能性
-
大規模テーブルで特に危険
対策:
-
WHERE句に使う列にインデックス追加
-
不必要な
SELECT *を避ける -
ファンクションインデックス
② JOIN方式を確認
| JOIN方式 | 特徴 | 適したケース |
|---|---|---|
| NESTED LOOPS | 小テーブル to 大テーブルに◎ | OLTP向き |
| HASH JOIN | 大量データ向き、高速 | DWH向き |
| MERGE JOIN | 並び替え前提、ソート負荷 | ソート後結合 |
Nested Loops × 大量データ → 遅い可能性
③ コスト(COST)とROWSを確認
| 項目 | 意味 |
|---|---|
| ROWS | 見積もられる行数 |
| COST | Oracleが見積もる負荷指数 |
| BYTES | データ量 |
COSTが極端に高い行がボトルネック候補。
④ SORTが多い場合
ORDER BY や DISTINCTが多いと遅くなる
対策:
-
必要な場面以外でDISTINCT使用しない
-
ORDER BYの列にインデックス
✅ 実例:遅いSQLの典型パターン
問題点
-
UPPER(ENAME)→ 関数でインデックス無効 -
LIKE ‘%〇〇’ → 前方ワイルドカードでインデックス無効
-
SELECT * → 不要な列読み込み
改善例
✅ チューニングの基本手順まとめ
| ステップ | 内容 |
|---|---|
| 1 | 実行計画を見る |
| 2 | TABLE FULL SCANをチェック |
| 3 | JOIN方法確認(Nested Loops vs Hash Join) |
| 4 | コスト高い箇所を特定 |
| 5 | インデックス/SQL修正 |
✅ まとめ
-
EXPLAIN PLANはSQLの動作設計図
-
インデックス利用とJOIN方式を重視
-
FULL SCANと高コスト行は警戒
-
必要な列だけ取得し、関数利用に注意
SQLチューニングは**「まず実行計画を見る」**がスタートです。
慣れるほど読み解きが早くなり、効率的な分析ができるようになります。
