SQL*Plus を使った実行計画の取得
SQL*Plus には実行計画と統計情報を取得するために以下の AUTOTRACE 設定がある
| AUTOTRACE オプション | 内容 |
| set autotrace on explain | 実行結果と実行計画を表示する。 |
| set autotrace on statistics | 実行結果と実行時統計情報を表示する。 |
| set autotrace on | 実行結果と実行計画、統計情報を表示する。 |
| set autotrace traceonly | 実行計画と統計を表示する。実行結果は表示しない。 |
| set autotrace off | autotrace をオフにする。 |
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> create table hoge(c varchar2(1));
SQL> set lines 200
SQL> col plan_plus_exp format a200
SQL> set pages 0
SQL> set autotrace on
SQL> select * from hoge;
レコードが選択されませんでした。
実行計画
----------------------------------------------------------
Plan hash value: 2339479017
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| HOGE | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
統計
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
281 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
実行計画の統計名と意味
| データベース統計名 | 説明 |
| recursive calls | 再帰的コールの回数(ユーザーおよびシステムレベル) |
| db block gets | ブロックの要求回数 |
| consistent gets | ブロックレベルの一貫性読込み回数 |
| physical reads | 物理読込みの合計数 (physical reads direct + physical reads cache) |
| redo size | 生成された REDO の合計(バイト) |
| bytes sent via SQL*Net to client | Oracle Net 経由でクライアントに送信されたバイト数 |
| bytes received via SQL*Net from clien | クライアントから受信したバイト数 |
| SQL*Net roundtrips to/from client | Oracle Net の送受信のやり取りの合計数 |
| sorts (memory) | 完全にメモリー内で実行されたソートの数 |
| sorts (disk) | ディスク書込みを伴ったソートの数 |
| rows processed | 処理を行なった行数 |
関連事項