Top > SQL*Plus > SQL*Plusで実行計画を取得する

SQL*Plus を使った実行計画の取得

SQL*Plus には実行計画と統計情報を取得するために以下の AUTOTRACE 設定がある

AUTOTRACE オプション内容
set autotrace on explain実行結果と実行計画を表示する。
set autotrace on statistics実行結果と実行時統計情報を表示する。
set autotrace on実行結果と実行計画、統計情報を表示する。
set autotrace traceonly実行計画と統計を表示する。実行結果は表示しない。
set autotrace offautotrace をオフにする。

EXPLAIN PLAN 文による実行計画の取得とは異なり DML の処理とフェッチ、データ転送処理も行なわれる(※)ので大量の件数を取得する検索文の場合には注意する。

(※) TRACEONLY を使用することでデータ表示に伴う速度の低下は軽減することは可能

AUTOTRACE 準備作業

実行計画と統計情報は 動的パフォーマンス・ビュー を参照する必要があるため一般ユーザーには使用できない場合がある。

PLUSTRACE ロールの作成スクリプト
(sys の v_$sesstat,v_$statname,v_$mystat パフォーマンスビューへの参照権限をもつロールの作成)

SYSDBA 権限で接続 (Windows 系でも '/' によるディレクトリ表記で問題ない)
# sqlplus / as sysdba
SQL> @?/sqlplus/admin/plustrce.sql
...
-- RIVUS ユーザーに PLUSTRACE ロールを付与
SQL> GRANT PLUSTRACE TO RIVUS;

準備作業 その2

実行計画を一時的に保存しておくテーブルの作成。
現在のバージョンにおいて PLAN_TABLE の作成は必須ではない。現在の初期設定では

CREATE GLOBAL TEMPORARY TABLE SYS.PLAN_TABLE$ ...
CREATE PUBLIC SYNONYM PLAN_TABLE FOR SYS.PLAN_TABLE$

の一時表の定義が使用されている。
utlxplan.sql の PLAN_TABLE は永続表であるが、SYS.PLAN_TABLE$ は一時表のために実行の度に 内容を削除しなくてもよいなど都合がよい。 SQL*Plus で DESC PLAN_TABLE で表定義が表示されるようであれば作成しない。

ユーザー・スキーマに PLAN_TABLE を作成

SQL> CONN RIVUS/password
SQL> @?/rdbms/admin/utlxplan.sql
.. 表の作成

実行計画の取得

実行計画の取得例

SQL> set lines 200
SQL> col plan_plus_exp format a200
SQL> set pages 0
SQL> set autotrace on
SQL> select num from test2 where num = 1;
 
レコードが選択されませんでした。
 
 
実行計画
----------------------------------------------------------
Plan hash value: 2520579295
 
------------------------------------------------------------------------------
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |           |     1 |     4 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| TEST2_IX1 |     1 |     4 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("NUM"=1)
 
 
統計
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        283  bytes sent via SQL*Net to client
        388  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

Predicate Information

オペレーションID(実行計画の ID列)の従属情報
例の場合には TEST2_IX1 のインデックスに対して "NUM"=1 で INDEX RANGE SCAN アクセスして結果を抽出していることを表わす。

この操作には Access Predicates(アクセス述語)と Filter Predicates (フィルタ述語)がある。

Access Predicates は、行(主に複数の行)を特定する操作に使用する述語(条件)を表わす。(能動的な操作のイメージ)
例えば ROWID を戻すようなアクセス構造体(インデックス)に対してキーを指定してアクセスする。

Filter Predicates は、結果セット(中間結果セット)を生成する前に条件に合うものをフィルタする述語(条件)を表わす。
つまり filter にはアクセスするための個別のアクセス構造(インデックスやジョイン)でなくテーブルやビューなどから中間結果セット(リザルトセット)の生成する前段のデータストリームの中から余分なものを取り除く操作を行なう。(受動的な操作のイメージ)
この「ふるい」操作には単純な評価式だけではなくクエリーが含まれることもある。

実行計画の統計名と意味

データベース統計名説明
recursive calls再帰的コールの回数(ユーザーおよびシステムレベル)
db block getsブロックの要求回数
consistent getsブロックレベルの一貫性読込み回数
physical reads物理読込みの合計数
(physical reads direct + physical reads cache)
redo size生成された REDO の合計(バイト)
bytes sent via SQL*Net to clientOracle Net 経由でクライアントに送信されたバイト数
bytes received via SQL*Net from clienクライアントから受信したバイト数
SQL*Net roundtrips to/from clientOracle Net の送受信のやり取りの合計数
sorts (memory)完全にメモリー内で実行されたソートの数
sorts (disk)ディスク書込みを伴ったソートの数
rows processed処理を行なった行数
 


実行計画の関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)