Oracleで実行計画を見る方法 | SQLチューニングガイド

データベース,SQL データベース
データベース

このページでは、OracleデータベースでSQLクエリの実行計画を確認する方法について詳しく説明します。

実行計画を確認することで、SQLのパフォーマンスを向上させるための改善点を特定することができます。

本記事では、実行計画の取得方法、事前に必要な設定、サンプルコード、および実行計画の結果を含めて解説します。

実行計画とは

実行計画とは、OracleデータベースがSQLクエリを実行する際に使用するステップを示すものです。

SQLのパフォーマンスチューニングには欠かせない情報で、クエリがどのように処理されるかを詳細に理解するために利用します。

なぜ実行計画が重要なのか

実行計画を確認することで、クエリのパフォーマンスを最適化するための手がかりを得ることができます。

特定のクエリがどのインデックスを使用しているか、フルスキャンが行われているか、結合方法が適切かを把握することで、効率的なデータベース運用が可能になります。

実行計画を確認するための準備

Oracleで実行計画を取得する前に、以下の設定や権限が必要です。

これらの手順を踏むことで、適切に実行計画を表示できるようになります。

権限の確認

実行計画を確認するには、ユーザーが EXPLAIN PLANSELECT ANY DICTIONARY の権限を持っている必要があります。

次のクエリで権限を確認します。

SELECT * FROM USER_SYS_PRIVS WHERE PRIVILEGE = 'EXPLAIN PLAN';

もし権限が不足している場合、DBAに依頼して適切な権限を付与してもらう必要があります。

PLAN_TABLEの確認

Oracleの標準ビューである PLAN_TABLE に実行計画が保存されます。

もし PLAN_TABLE が作成されていない場合、次のコマンドを実行して作成します。

@$ORACLE_HOME/rdbms/admin/utlxplan.sql

このSQLスクリプトは、Oracleデータベースの管理ディレクトリに保存されているため、適切なパスに移動して実行する必要があります。

実行計画の取得方法

実行計画を取得するためには、EXPLAIN PLAN ステートメントを使用します。

以下の手順に従って、実行計画を確認します。

EXPLAIN PLANの使い方

以下の構文を使って、任意のSQLクエリに対する実行計画を取得します。

EXPLAIN PLAN FOR
    SELECT column1, column2
    FROM table_name
    WHERE condition;

これにより、実行計画が PLAN_TABLE に保存されます。

実行計画の表示

次に、保存された実行計画を表示するためには、次のクエリを実行します。

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

これにより、PLAN_TABLE に保存された最新の実行計画が表示されます。

以下に、実行計画の結果例を示します。

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------
| Id  | Operation              | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |             |     1 |    12 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES   |     1 |    12 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN      | EMP_DEPT_IDX|     1 |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("DEPARTMENT_ID"=10)

上記の実行計画では、EMPLOYEES テーブルに対するクエリが INDEX RANGE SCAN を使用して実行されていることがわかります。

これは、インデックス EMP_DEPT_IDX を利用して DEPARTMENT_ID 列の検索が効率化されていることを示しています。

  • Id 0:全体のSQLステートメントを示します。SELECT STATEMENT が最上位に表示され、最終的な結果が取得される処理です。
  • Id 1:インデックスで検索された行に基づいて、EMPLOYEES テーブルからデータを取得しています。
  • Id 2:インデックス EMP_DEPT_IDX を使用して DEPARTMENT_ID = 10 の条件を満たす行を検索しています。

このように、実行計画を確認することで、どのインデックスが使用されているか、効率的なクエリ実行が行われているかを確認できます。

実装サンプル

以下は、実際に実行計画を確認するための完全なサンプルコードです。

-- PLAN_TABLEの作成
@$ORACLE_HOME/rdbms/admin/utlxplan.sql

-- SQLクエリの実行計画を取得
EXPLAIN PLAN FOR
SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 10;

-- 実行計画の表示
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

まとめ

OracleでのSQLクエリの実行計画を確認することで、データベースのパフォーマンスを最適化するための重要なステップを踏むことができます。

本記事では、実行計画を取得するための準備手順、実際の取得方法、実行計画の結果および解釈、およびサンプルコードを紹介しました。

これにより、効率的なSQLパフォーマンスチューニングが可能になります。

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