小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


OracleでSQLの実行時間を計測する方法


photo credit: wwarby via photopin cc

はじめに

Oracle DBを使ったアプリケーション開発において、あるSQLの実行にどれくらいの時間がかかっているかを知りたいときがあると思います。
この記事では、SQLの実行時間を計測する方法を紹介します。

新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)
小田 圭二 大塚 信男 五十嵐 建平 谷 敦雄 宮崎 博之 神田 達成 村方 仁
翔泳社
売り上げランキング: 95,225

SQLの実行時間を計測する

SQLの実行時間を計測するには、目的のSQLを実行する前に、set timing onを実行します。これによって、実行に要した時間を出力することができます。

set timing on
select * from Table01;


ただし、この実行時間はSQLの結果を画面に出力する時間も含まれています。大量の結果を返すようなSQLの場合、画面に出力するだけで時間がかかってしまうことがあります。

SQLの結果を出力せずに、純粋な実行時間のみを計測する

SQLの結果を画面に出力することなく、純粋にSQLの実行時間のみを出力したい場合、SQL*Plusのautotraceという機能を使います。

以下の例では、set autotrace traceonlyを指定することで、実行結果を出力しないようにしています。この状態で、set timing onで実行時間を計測すると、実行結果の出力時間を除いた純粋な実行時間が表示されます。

set autotrace traceonly
set timing on
select * from Table01;

set autotraceコマンドを実行した場合に、エラーになる場合は、以下の記事の手順に従ってみてください。

set autotraceを用いた場合、以下のように出力されます。

SQL> set autotrace traceonly
SQL> set timing on
SQL> select * from Table01;

経過: 00:00:00.01

実行計画

                                                                                                                  • -

Plan hash value: 2567418043

                                                                                                                                                        • -
Id Operation Name Rows Bytes Cost (%CPU) Time
                                                                                                                                                        • -
0 SELECT STATEMENT 1 41 2 (0) 00:00:01
1 TABLE ACCESS FULL TABLE01 1 41 2 (0) 00:00:01
                                                                                                                                                        • -


統計

                                                                                                                  • -

0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
601 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

おわりに

アプリケーションの性能がでない場合など、上記の方法を知っているとボトルネックとなっているSQLを探し出すことができるのではないでしょうか。