OracleでSQL文の処理時間を測定する方法
SQL のパフォーマンスチューニングをするために、SQL の処理時間や処理負荷を調べるのはとても重要な作業です。
一般的にはデバッグ用のログをプログラムに仕掛け、プログラム処理速度の観点も含めて確認します。その上で SQL に問題ありそうと判断した場合に、より詳しい検証作業を実施します。
もし SQL の処理時間を測定するだけであれば、SQL*Plus 上で簡単に確認できます。では具体的にどうやるのか、詳しく見ていきましょう。
SQLの処理時間測定方法
全体の手順の流れ
- SQL*Plus を開く
- 実行結果 (クエリの結果) を非表示に設定する
- 経過時間を測定する設定を行う
- 測定したい SQL を実行する
2番目の SQL 実行結果を非表示にしている理由は、データ出力に掛かった時間も計測対象になるためです。純粋に SQL のレスポンス速度がどれくらいかを把握するだけなら、非表示にしておいたほうが確認しやすいです。
SQL*Plus での実行内容
SQL*Plus を起動したら、対象のデータベースにログインして次のコマンドを発行します。
- set autotrace traceonly
- set timing on
- SQL 実行
注目するのは SQL を発行してから処理が戻るまでのレスポンス速度。ここでは SQL の実行結果を非表示にして進めていきます。
まず AUTOTRACE の設定を行い、SQL の抽出結果を非表示にします。そして経過時間を測定できるように TIMING の設定を行います。2つの設定をしたら、あとは調査対象の SQL を実行するだけです。
SQL処理時間の測定例
上記コマンドを設定した場合の出力例を以下に示します。
SQL> set autotrace traceonly SQL> set timing on SQL> select c_hoge from T_HOGE; 12行が選択されました。 経過: 00:00:00.08 実行計画 ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=12 Bytes=972) 1 0 TABLE ACCESS (FULL) OF 'T_HOGE' (TABLE) (Cost=3 Card=12 Bytes=972) 統計 ---------------------------------------------------------- 1 recursive calls 0 db block gets 8 consistent gets 6 physical reads 0 redo size 2773 bytes sent via SQL*Net to client 504 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 12 rows processed
処理結果から select の抽出結果は12行。掛かった時間は 0.08 秒だとわかりました。
また AUTOTRACE の設定に伴い 実行計画 も出力されます。この情報は SQL の処理負荷や改善点を分析するときに役立ちます。
また実行計画の分析から、処理速度を向上させるヒントを見つけることもできます。単に掛かった時間だけを見るのではなく、こちらも一緒に確認しておく習慣を持っておくと良いです。
以上、Oracle で SQL 文の処理時間を測定する方法の紹介でした。