【Oracle】SQLの実行計画を確認する方法
-
カテゴリ:
- DB
-
タグ:
- #Oracle
よく仕事ではMySQLを使っているのですが、Oracleで実行計画を見ようと思ったときにどうやるんだ?と一瞬困ったことがあったのでここにメモしておきます。
MySQLの場合は、確認したいSQLの先頭に「EXPLAIN」をつけて実行すれば、
実行計画が表示されます。
EXPLAIN SELECT * FROM table;
Oracleの実行計画を確認
構文
Oracleの場合、2段回の工程を踏んで確認する必要があります。
まず実行計画を確認したいSQLの最初に「 EXPLAIN PLAN FOR」をつけて
クエリを発行する。
EXPLAIN PLAN FOR SELECT * FROM table;
クエリの戻り値はありませんよ!と怒られますが無視して次のクエリを流すと実行計画が表示されます。
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
plan table outputの見方は以下のサイトに詳しく乗っていますので、
それらと参照ください。
検証
実際に実行計画を確認してみます。以下の2つのテーブルを使って検証を行います。
テーブル名:M_CUSTOMER(顧客マスタ)
ID | CUSTOMER_CD | NAME | NAME_KANA | TEL | BIRTHDAY | |
---|---|---|---|---|---|---|
1 | 001 | 太郎 | TARO | 09000000001 | taro@sample.com | 1986-01-01 |
2 | 002 | 次郎 | JIRO | 09000000002 | jiro@sample.com | 1999-01-02 |
3 | 003 | 花子 | HANAKO | 09000000003 | hanako@sample.com | 2019-01-03 |
テーブル名:T_SALES_HISTORY(購入履歴テーブル)
ID | ITEM_NAME (商品名) |
PRICE (価格) |
CUSTOMER_CD |
DATE (購入日) |
---|---|---|---|---|
1 | デスクトップPC | 200000 | 001 | 2020-01-05 |
2 | マウス | 4500 | 001 | 2020-02-01 |
3 | モニター | 30000 | 003 | 2020-03-04 |
実行計画を確認するSQLを実行。
-- 実行計画を取得
EXPLAIN PLAN FOR
SELECT
*
FROM
M_CUSTOMER mc
INNER JOIN
T_SALES_HISTORY tsh
ON mc.CUSTOMER_CD = tsh.CUSTOMER_CD ;
-- 実行計画を表示
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
結果は以下の通りになります。
PLAN_TABLE_OUTPUT
Plan hash value: 972612044
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 425 | 69700 | 8 (0)| 00:00:01 |
|* 1 | HASH JOIN | | 425 | 69700 | 8 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| M_CUSTOMER | 31 | 2511 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T_SALES_HISTORY | 425 | 35275 | 5 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("MC"."CUSTOMER_CD"="TSH"."CUSTOMER_CD")
テーブルの結合部分がFULLスキャンになっていることが分かると思います。
両テーブルのCUSTOMER_CDカラムにインデックスを張ることで、パフォーマンスが改善されます。
以上です。
投稿日:2018-08-08
更新日:2020-08-13