【Oracle】SELECT文チューニング完全ガイド:実行計画・インデックス設計・ヒント句で性能を引き出す

IT技術情報

1. はじめに:SQLチューニングは“読む力”と“意図を伝える力”

OracleのSQLチューニングは「書き方を変える」だけではありません。
データベースが**どう解釈して実行しているか(実行計画)を理解し、
必要に応じて
意図的に誘導(HINT)**するのが本質です。


2. 実行計画を確認する基本:EXPLAIN PLANとAUTOTRACE

■ EXPLAIN PLAN の基本

実行結果の主なカラム:

カラム名意味
OPERATION実行操作(TABLE ACCESSなど)
OPTIONS操作のタイプ(FULL, BY INDEX ROWIDなど)
OBJECT_NAMEテーブル/インデックス名
COSTコスト見積もり値(低いほど速い傾向)

■ AUTOTRACEを使って実行と同時に確認

結果に実際のI/O統計と実行計画が表示されます。
👉 開発環境では常にON推奨。


3. インデックス設計の基本と誤解されやすい点

■ インデックスを張るべき列

ケース理由
WHERE句で頻繁に使用絞り込みに貢献
JOIN条件列結合効率を改善
ORDER BY/GROUP BY列並び替えコスト削減

■ よくある“悪い”例

→ 関数が列にかかるとインデックスが無効化されます。
 対策:関数索引(Function-Based Index)を使用。


■ 複合インデックスの順序は“左から順”

→ WHERE句に area = 'TOKYO' AND order_date > SYSDATE - 30 があれば有効。
 逆順条件(order_dateだけ)では使われないので注意。


4. 統計情報の更新でオプティマイザを賢くする

👉 統計情報が古いと実行計画が最適でなくなる。
 定期ジョブで週1回更新が理想です。


5. 実践:フルスキャンを回避して速度を改善

■ 例:30万件の売上テーブルから東京の注文を抽出

実行計画:

フルスキャン
対応策:

再実行:

実行時間が 3.8秒 → 0.2秒 に短縮。


6. HINT句を使った実行計画の制御

Oracleのオプティマイザは非常に賢いですが、
時には意図通りの実行計画を選ばないこともあります。
そんなときに使えるのが HINT句 です。


■ 基本構文

👉 /*+ ... */ 内にヒントを記述。
INDEX は指定インデックスを強制使用します。


■ 主なHINT句一覧(現行でも使用可能)

HINT意味用途
FULL(table)フルスキャンを強制小テーブルなど
INDEX(table index_name)指定インデックスを強制逆にINDEXを使わせたい時
NO_INDEX(table)インデックス使用禁止誤判定を避けたい時
USE_NLネストループ結合を強制小規模JOINに最適
USE_HASHハッシュ結合を強制大規模JOINに有効
ORDEREDJOIN順序を指定オプティマイザ任せにしない
PARALLEL並列実行を指定大量データ抽出時

👉 2025年現在もHINT句は現役
 ただし、Oracle 19c以降では自動チューニング機能が賢くなっており、
 乱用よりも「限定的な補助」に使うのがコツです。


7. 実務でのチューニング手順(例)

手順作業コマンド例
① 現状確認実行計画を取得EXPLAIN PLAN
② 絞り込み列確認WHERE条件を分析条件列を洗い出す
③ インデックス確認DBA_INDEXESを確認既存索引を再利用
④ 統計情報更新DBMS_STATSコスト計算を最新化
⑤ ヒント句適用特殊ケースのみUSE_NL など最終調整

8. 裏技:実行計画をキャッシュして差分確認する

👉 実際にOracleが選んだ実行計画を照会可能。
 複数パターンを比較して「チューニング効果の見える化」ができます。


9. チューニング時の落とし穴まとめ

落とし穴説明回避策
関数をWHERE句に使ってINDEX無効TO_CHAR(col)などFunction-Based Index
統計情報が古い実行計画が誤るDBMS_STATS更新
OR条件が多いフルスキャン化UNIONまたはINに分割
不要なORDER BYソートコスト増UI側で制御
LIKE ‘%xxx’インデックス無効INSTR活用 or N-gram索引

10. まとめ:オプティマイザを理解し、正しく導く

カテゴリ対策効果
インデックス設計主キー+WHERE列優先抽出効率化
統計更新DBMS_STATSで定期実施コスト最適化
実行計画分析DBMS_XPLAN/AUTOTRACEボトルネック特定
HINT活用INDEX, USE_NLなど意図的制御

SQLチューニングは**“DBに考えさせる”のではなく、“考える材料を与える”作業**です。
HINT句はそのための“囁き”のような存在。
適切に使えば、Oracleは想像以上に速く、正確に動きます。

コメント

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