SQLオプティマイザが使用する実行パス、および文の実行統計に関するレポートを自動的に取得できます。このレポートは、SQLのDML(SELECT、DELETE、UPDATEおよびINSERT)文が正常に実行された後に生成されます。このレポートは、これらの文のパフォーマンスを監視し、チューニングする場合に有効です。
動的サンプリングが有効な場合、DMLに関するSQL*Plusのレポート出力が異なる場合があります。
AUTOTRACEシステム変数を設定することによって、レポートを制御できます。
自動トレースの設定 | 結果 |
---|---|
SET AUTOTRACE OFF |
AUTOTRACEレポートは生成されません。これはデフォルトです。 |
SET AUTOTRACE ON EXPLAIN |
AUTOTRACEレポートには、オプティマイザの実行パスのみ示されます。 |
SET AUTOTRACE ON STATISTICS |
AUTOTRACEレポートには、SQL文の実行統計のみ示されます。 |
SET AUTOTRACE ON |
AUTOTRACEレポートには、オプティマイザの実行パスとSQL文の実行統計の両方が含まれます。 |
SET AUTOTRACE TRACEONLY |
SET AUTOTRACE ONに似ていますが、ユーザーの問合せの出力は行われません。STATISTICSが使用可能な場合、問合せデータはフェッチされますが、出力は行われません。 |
この機能を使用するには、自分のスキーマにPLAN_TABLE表を作成する必要があります。また、PLUSTRACEロールが必要です。DBA権限に、PLUSTRACEロールを付与する必要があります。ロールの付与方法およびPLAN_TABLE表の作成方法については、『Oracle Database SQL言語リファレンス』を参照してください。
ロールおよびPLAN_TABLE表の詳細は、『Oracle Database SQL言語リファレンス』および「SET」コマンドのAUTOTRACE変数を参照してください。
注意:
SQL*Plus AUTOTRACEでは、ALTER SESSION SET CONTAINERオプションを使用したコンテナの切替えはサポートしていません。この場合に収集された統計データには一貫性がない可能性があります。
Table created.
Role dropped.
create role plustrace;
Role created.
grant plustrace to dba with admin option;
Grant succeeded.
Grant succeeded.
例8-1 PLAN_TABLEの作成
SQL*Plusセッションから次のコマンドを実行して、HRスキーマにPLAN_TABLEを作成します。
CONNECT HR @$ORACLE_HOME/rdbms/admin/utlxplan.sql
例8-2 PLUSTRACEロールの作成
SQL*Plusセッションから次のコマンドを実行して、PLUSTRACEロールを作成し、DBAにそのロールを付与します。
CONNECT / AS SYSDBA @$ORACLE_HOME/sqlplus/admin/plustrce.sql drop role plustrace;
例8-3 PLUSTRACEロールの付与
SQL*Plusセッションから次のコマンドを実行して、HRユーザーにPLUSTRACEロールを付与します。
CONNECT / AS SYSDBA GRANT PLUSTRACE TO HR;
統計は、文を実行したときにサーバーによって記録され、文の実行に必要とされたシステム・リソースを示します。結果には、次の統計が含まれます。
データベース統計名 | 説明 |
---|---|
recursive calls |
ユーザーおよびシステム・レベルの両方で生成された再帰コールの数。Oracle Databaseでは、内部処理に使用した表を保持します。これらの表を変更する必要がある場合、Oracle Databaseでは内部SQL文を内部的に生成し、この内部SQL文がかわりに再帰的コールを生成します。 |
db block gets |
CURRENTブロックが要求された回数。 |
consistent gets |
ブロックに対して読取り一貫性が要求された回数。 |
physical reads |
ディスクから読み込まれたデータ・ブロックの合計数。「physical reads direct」とバッファ・キャッシュへの読込み合計数を足した数と同じ値になります。 |
redo size |
生成されたREDOの合計バイト数 |
bytes sent through Oracle Net Services to client |
フォアグラウンド・プロセスからクライアントへ送信された合計バイト数。 |
bytes received through Oracle Net Services from client |
Oracle Netによってクライアントから受信した合計バイト数。 |
Oracle Net Services round-trips to/from client |
クライアントとの間で送受信されたOracle Netメッセージの合計数。 |
sorts (memory) |
メモリー内で完全に実行され、ディスク書込みを必要としないソート操作数 |
sorts (disk) |
1回以上のディスク書込みを必要としたソート操作数 |
rows processed |
操作中に処理された行の数。 |
統計の中で参照されるクライアントは、SQL*Plusです。「Oracle Net」は、Oracle Netがインストールされているかどうかに関係なく、SQL*Plusとサーバー間の汎用プロセス通信を意味します。統計レポートのデフォルト書式は変更できません。
データベース統計の完全なリストについては、『Oracle Databaseリファレンス』を参照してください。統計およびその解釈方法の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』の第3章「オプティマイザ統計の収集」を参照してください。
LAST_NAME SALARY JOB_TITLE ------------------------- ---------- ----------------------------------- King 24000 President De Haan 17000 Administration Vice President Kochhar 17000 Administration Vice President Partners 13500 Sales Manager Russell 14000 Sales Manager Hartstein 13000 Marketing Manager 6 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 2988506077 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 6 | 360 | 6 (17)| 00:00:01 | |* 1 | HASH JOIN | | 6 | 360 | 6 (17)| 00:00:01 | |* 2 | TABLE ACCESS FULL| EMPLOYEES| 6 | 204 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| JOBS | 19 | 494 | 2 (0)| 00:00:01 | ------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("E"."JOB_ID"="J"."JOB_ID") 2 - filter("E"."SALARY">12000) Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 10 consistent gets 0 physical reads 0 redo size 706 bytes sent via Oracle Net Services to client 496 bytes received via Oracle Net Services from client 2 Oracle Net Services roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 6 rows processed
6 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 2988506077 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 6 | 360 | 6 (17)| 00:00:01 | |* 1 | HASH JOIN | | 6 | 360 | 6 (17)| 00:00:01 | |* 2 | TABLE ACCESS FULL| EMPLOYEES| 6 | 204 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| JOBS | 19 | 494 | 2 (0)| 00:00:01 | ------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("E"."JOB_ID"="J"."JOB_ID") 2 - filter("E"."SALARY">12000) Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 10 consistent gets 0 physical reads 0 redo size 706 bytes sent via Oracle Net Services to client 496 bytes received via Oracle Net Services from client 2 Oracle Net Services roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 6 rows processed
このオプションは、大規模な問合せのチューニング中に、問合せレポートを表示しない場合に有効です。
注意:
出力は、サーバーのバージョンおよび構成によって異なります。
例8-4 パフォーマンス統計および問合せ実行パス用の文のトレース
SELECT E.LAST_NAME, E.SALARY, J.JOB_TITLE FROM EMPLOYEES E, JOBS J WHERE E.JOB_ID=J.JOB_ID AND E.SALARY>12000;
この文を実行すると、次のように文のトレースが自動的に行われます。
SET AUTOTRACE ON /
例8-5 問合せデータを表示せずに文をトレースする方法
問合せデータを表示せずに同じ文をトレースするには、次のように入力します。
SET AUTOTRACE TRACEONLY /