【Oracle】SQLの実行計画を取得する方法

よく仕事では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の見方は以下のサイトに詳しく乗っていますので、
それらと参照ください。

参考:12 EXPLAIN PLANの使用方法

 

検証

実際に実行計画を確認してみます。以下の2つのテーブルを使って検証を行います。

テーブル名:M_CUSTOMER(顧客マスタ)

ID CUSTOMER_CD NAME NAME_KANA TEL MAIL 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
(顧客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-03-25

[スポンサーリンク]

関連記事
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
サイト内検索
プロフィール

プロフィール

[Name : じゃぶじゃぶ(@jbjb_2019)]
都内で社内SEをしているおじさん。
仕事で得られる知識だけでは限界を感じ、 WEBの勉強がてらITブログを開始。
サーバからWEBサイトまでフルスクラッチで開発しました。
現在は勉強のモチベーションを保つために活用中。
興味があることを雑記的に書いていきます。

[スポンサーリンク]

[スポンサードリンク]

最近の記事