SQL:実行計画(EXPLAIN PLAN)の読み方とボトルネックの見つけ方

データベースチューニングにおいて「どの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見積もられる行数
COSTOracleが見積もる負荷指数
BYTESデータ量

COSTが極端に高い行がボトルネック候補。


④ SORTが多い場合

ORDER BY や DISTINCTが多いと遅くなる

対策:

  • 必要な場面以外でDISTINCT使用しない

  • ORDER BYの列にインデックス


✅ 実例:遅いSQLの典型パターン

問題点

  • UPPER(ENAME) → 関数でインデックス無効

  • LIKE ‘%〇〇’ → 前方ワイルドカードでインデックス無効

  • SELECT * → 不要な列読み込み

改善例


✅ チューニングの基本手順まとめ

ステップ内容
1実行計画を見る
2TABLE FULL SCANをチェック
3JOIN方法確認(Nested Loops vs Hash Join)
4コスト高い箇所を特定
5インデックス/SQL修正

✅ まとめ

  • EXPLAIN PLANはSQLの動作設計図

  • インデックス利用とJOIN方式を重視

  • FULL SCANと高コスト行は警戒

  • 必要な列だけ取得し、関数利用に注意

SQLチューニングは**「まず実行計画を見る」**がスタートです。
慣れるほど読み解きが早くなり、効率的な分析ができるようになります。

Java:IllegalArgumentExceptionの意味と例外設計のベストプラクティス

Javaアプリケーション開発では「想定外の入力」に対して適切にエラーを発生させ、プログラムの異常動作を防ぐことが重要です。その際によく使用される例外のひとつが IllegalArgumentException です。

本記事では、IllegalArgumentException の意味、発生するケース、使い方の例、そして例外設計のベストプラクティスまで徹底解説します。


IllegalArgumentExceptionとは?

IllegalArgumentException とは、

メソッドに不正な引数(値)が渡された場合にスローされる実行時例外(RuntimeException)

です。

例えば、年齢を受け取るメソッドに 負の値 が渡された場合など、
「引数の値が意味を成していない」状態で使われます。


なぜIllegalArgumentExceptionを使うのか?

✔ 不適切な入力を早期に検知
✔ 異常な状態を防ぎ、予測可能な動作を保証
✔ 開発者や利用側に明確なフィードバック

特に、ライブラリ・APIの開発時には重要です。
「どんな値が許容されるのか?」を明確にすることで利用者のミスを防げます。


IllegalArgumentExceptionの基本例

✅ 正の値のみ受け付けるメソッド例

チェックポイント

  • 条件式で検証

  • 明確なメッセージで何が悪いか伝える


Integerチューター:標準APIにも見る例

Java標準APIも積極的にこの例外を使っています。

例:Thread#setPriority(int priority)

Java公式の一貫性ある設計に従うことで、コード品質が向上します。


IllegalArgumentException vs 他の例外

例外使う場面
IllegalArgumentException引数の値が不正
NullPointerException引数がnull不可なのにnull
IllegalStateExceptionオブジェクトの状態が不正
IOExceptionI/O操作中の問題

ポイント

  • 値がおかしい→IllegalArgumentException

  • 状態がおかしい→IllegalStateException


ベストプラクティス:例外設計ガイド

✅ 1. 早めにチェックする(Fail Fast)

異常はできるだけ早く発見しましょう。

✅ 2. メッセージで原因を明示

悪い例(NG)

何が悪いのか分からない…

✅ 3. Javadocで事前に仕様を明記

APIの信頼性が向上します。

✅ 4. nullチェックはObjects.requireNonNullで簡潔に


ユースケース:バリデーションロジックの整理方法

例外処理が肥大化しないよう、専用バリデータクラスを作るアプローチも有効です。

利用例:


まとめ

ポイント内容
例外名IllegalArgumentException
意味不正な引数が渡された
目的予期しない動作を防ぐ
コツFail Fast、明確なメッセージ、仕様明記

良い例外設計はコードの信頼性・保守性を大きく高めます。
実務でも積極的に活用していきましょう!

Oracle「ORA-00942: 表またはビューが存在しません」エラー発生原因と解決策

Oracleデータベースを扱う中で、開発者や運用担当者が最も遭遇しやすいエラーのひとつが
「ORA-00942: 表またはビューが存在しません」 です。

本記事では、発生原因と具体的な解決策をわかりやすく解説します。


✅ ORA-00942とは?

ORA-00942: table or view does not exist
(表またはビューが存在しません)

SQLで参照したテーブルまたはビューが見つからないときに発生するエラーです。
主に DML(SELECT / INSERT / UPDATE / DELETE)実行時に発生します。


✅ 主な発生原因

原因説明
テーブル名・ビュー名の誤字タイプミス、大小文字の不一致
スキーマ名を指定していないschema.table が必要なのに table だけ記述
オブジェクトが存在しない作成前、削除済み、まだコミットされていない
権限不足SELECT権限などが付与されていない
PUBLIC SYNONYMが無い/壊れているシノニム経由アクセス失敗
参照先データベースリンクが不正DBリンク先にオブジェクトが存在しない

✅ 代表的な発生例と解決策

① テーブル名の誤字

対策
スペルを確認し、USER_TABLESALL_TABLES で存在確認。


② スキーマ指定漏れ

本当は他スキーマのテーブル:

対策
必要に応じてスキーマ名を付けて記述。


③ 権限不足

権限が無い場合、テーブルが存在していても参照できません。

✅ 権限付与例(管理者実行)


④ シノニム問題

シノニム経由で参照する場合:

対策

壊れていれば再作成。


⑤ コミット忘れ

セッションAで作成 → セッションBから参照、未コミットの場合

対策
テーブル作成後は COMMIT;


✅ 原因の切り分け手順(チェックリスト)

チェック項目コマンド / 方法
テーブルが存在するかSELECT table_name FROM user_tables;
他スキーマかSELECT owner, table_name FROM all_tables;
権限があるかSELECT * FROM user_tab_privs;
シノニム確認SELECT * FROM all_synonyms;
大文字小文字SQL識別子は大文字扱い、""付きは注意

✅ よくある落とし穴

  • "テーブル名"(ダブルクォーテーション付き)で作成 → 大文字小文字が区別される

  • パーティションテーブルの参照ミス

  • DB移行後の権限不足

  • テスト環境と本番環境のスキーマ構成違い


✅ まとめ

要点内容
エラー原因オブジェクトなし・スキーマ指定漏れ・権限不足
解決方法テーブル存在確認、権限確認、スキーマ明記
コツuser_tables / all_tables で確認

Oracleはスキーマ管理と権限管理が厳密なため、
「テーブルが本当に存在するか」「アクセス権があるか」 が重要です。


✅ 例:実務での対応テンプレ

■ 発生時に実施する確認

  • SQLを確認(スペル・スキーマ)

  • ALL_TABLESで存在確認

  • 権限を確認

  • 必要に応じて GRANT 実施

この手順を覚えておけば、ほぼ解決できます。


💬 最後に

Oracleの権限周りは慣れるまで少し難しいですが、
このエラーは落ち着いて確認すれば必ず解決できます。

記事が役に立ったら、ぜひシェアやブックマークをお願いします!