Oracleでクエリの実行時間を取得したいです。 Oracleが結果を出力するのに必要な時間ではなく、実行時間だけが必要です。
MySQLでは、シェルから実行時間を簡単に取得できます。
SQL * Plusでこれを行うにはどうすればよいですか?
SQL * PlusコマンドSET TIMING ON
を発行して実時間を取得することはできますが、たとえば、時間を簡単に取得することはできません。
AUTOTRACE設定をSET AUTOTRACE TRACEONLY
として使用すると、出力は抑制されますが、クエリを満たすためにすべての作業が実行され、結果がSQL * Plusに返されます。
最後に、SQL * Plusセッションをトレースし、「クライアントへのSQL * Netメッセージ」、「クライアントからのSQL * Netメッセージ」など、クライアント待機であるイベントでの待機時間を手動で計算できます。
つかいます:
set serveroutput on
variable n number
exec :n := dbms_utility.get_time;
select ......
exec dbms_output.put_line( (dbms_utility.get_time-:n)/100) || ' seconds....' );
または場合によっては:
SET TIMING ON;
-- do stuff
SET TIMING OFF;
...経過した100分の1秒を取得します。
どちらの場合でも、経過時間はサーバーの負荷などの影響を受ける可能性があります。
参照:
select LAST_LOAD_TIME, ELAPSED_TIME, MODULE, SQL_TEXT elapsed from v$sql
order by LAST_LOAD_TIME desc
より複雑な例(PATTERN
の削除または置換を忘れないでください):
select * from (
select LAST_LOAD_TIME, to_char(ELAPSED_TIME/1000, '999,999,999.000') || ' ms' as TIME,
MODULE, SQL_TEXT from SYS."V_\$SQL"
where SQL_TEXT like '%PATTERN%'
order by LAST_LOAD_TIME desc
) where ROWNUM <= 5;
一貫した取得/論理読み取りを、実行時よりも「作業」の優れたプロキシとして見ることをお勧めします。実行時間は、データベースサーバーで他に何が起こっているか、キャッシュ内にどれくらいあるかなどによって歪む可能性があります。
ただし、SQLの実行時間が本当に必要な場合、V $ SQLビューにはCPU_TIMEとELAPSED_TIMEの両方があります。