web-dev-qa-db-ja.com

Oracleクエリの実行時間

Oracleでクエリの実行時間を取得したいです。 Oracleが結果を出力するのに必要な時間ではなく、実行時間だけが必要です。

MySQLでは、シェルから実行時間を簡単に取得できます。

SQL * Plusでこれを行うにはどうすればよいですか?

29
user429743

SQL * PlusコマンドSET TIMING ONを発行して実時間を取得することはできますが、たとえば、時間を簡単に取得することはできません。

AUTOTRACE設定をSET AUTOTRACE TRACEONLYとして使用すると、出力は抑制されますが、クエリを満たすためにすべての作業が実行され、結果がSQL * Plusに返されます。

最後に、SQL * Plusセッションをトレースし、「クライアントへのSQL * Netメッセージ」、「クライアントからのSQL * Netメッセージ」など、クライアント待機であるイベントでの待機時間を手動で計算できます。

25
Adam Musch

つかいます:

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秒を取得します。

どちらの場合でも、経過時間はサーバーの負荷などの影響を受ける可能性があります。

参照:

18
OMG Ponies
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;
7
gavenkoa

一貫した取得/論理読み取りを、実行時よりも「作業」の優れたプロキシとして見ることをお勧めします。実行時間は、データベースサーバーで他に何が起こっているか、キャッシュ内にどれくらいあるかなどによって歪む可能性があります。

ただし、SQLの実行時間が本当に必要な場合、V $ SQLビューにはCPU_TIMEとELAPSED_TIMEの両方があります。

3
Gary Myers