Top > PLSQL プログラミング入門(2) > プログラムの実行時間を計測する

PL/SQL によるプログラム処理時間計測 ストップウォッチ

プログラムの処理速度を計測するためのパッケージ。
計測時間の最小単位を 1/100 秒 単位の整数で戻す。1/100 単位の秒数を経過時間の形式(HH24:MI:SS.FF2 形式)で表示できるようにフォーマットする。
(DBMS_UTILITY.GET_TIME を使用することで Oracle8i でも動くように作ったつもりですが動作確認まではしていません)

プロシージャ・ファンクション名機能
START_TIMEストップウォッチのスタート
SPLIT_TIME経過秒数(1/100秒単位)を戻す&計測の継続
STOP_TIME所要秒数を戻す&ストップウォッチのクリア
TO_TIME1/100 秒単位の数値を時分秒の文字列に変換

表示精度の改良

最小の精度をミリ秒以下にしたい場合 SYSTIMESTAMP 関数 Oracle 9i をする。
最大の精度を日にち以上にしたい場合 EXTRACT 関数 で日にちを分けて処理すると 動作対象が Oracle 9i 以上になってしまうが TO_CHAR で記述するよりスマートに書ける。

使用例

SQL> column time format a25
SQL> call STOPWATCH.START_TIME();
SQL> select count(*) from all_catalog;
..(結果省略)
 
SQL> select STOPWATCH.TO_TIME(STOPWATCH.SPLIT_TIME,'経過時間:') time from dual;
 
TIME
-------------------------
経過時間:00:00:00.08
 
SQL> set serveroutput on
SQL> call dbms_lock.sleep(60.123);
SQL> call dbms_output.put_line(STOPWATCH.TO_TIME(STOPWATCH.STOP_TIME,'合計時間:'));
合計時間:00:01:00.20

時間計測パッケージ・パッケージ本体 ソースコード

パッケージ定義部

CREATE OR REPLACE PACKAGE RIVUS.STOPWATCH
IS
  FUNCTION TO_TIME(P_HSEC IN NUMBER,  P_CAPTION IN VARCHAR2 := '')
  RETURN VARCHAR2;
  --
  PROCEDURE START_TIME;
  --
  FUNCTION SPLIT_TIME
  RETURN NUMBER;
  --
  FUNCTION STOP_TIME
  RETURN NUMBER;
END;
/

パッケージ本体

CREATE OR REPLACE PACKAGE BODY RIVUS.STOPWATCH
IS
  gStartTimeMemory  NUMBER;
  FUNCTION TO_TIME(P_HSEC IN NUMBER,  P_CAPTION IN VARCHAR2 := '')
  RETURN VARCHAR2
  IS
    vMesg    VARCHAR2(2000);
    vDatetime  DATE;
 
  BEGIN
    IF (P_HSEC IS NULL) THEN
      vMesg := 'START されていません';
    ELSE
      vDatetime := TO_DATE('2000', 'YYYY') + P_HSEC / 24 / 60 / 60 / 100;
      vMesg := P_CAPTION ||  TO_CHAR(vDatetime, 'HH24:MI:SS.');
      vMesg := vMesg || TO_CHAR(MOD(P_HSEC, 100), 'FM00');
    END IF;
    RETURN vMesg;
  END;
  --
  PROCEDURE START_TIME
  IS BEGIN
    gStartTimeMemory := DBMS_UTILITY.GET_TIME;
  END;
  --
  FUNCTION SPLIT_TIME
  RETURN NUMBER IS
  BEGIN
    RETURN DBMS_UTILITY.GET_TIME - gStartTimeMemory;
  END;
  FUNCTION STOP_TIME
  RETURN NUMBER IS
    vSec  NUMBER;
  BEGIN
    vSec := DBMS_UTILITY.GET_TIME - gStartTimeMemory;
    gStartTimeMemory := NULL;
    RETURN vSec;
  END;
END;
/


関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト