web-dev-qa-db-ja.com

plsqlのプロシージャ内のSQL文の時間を測定する

テーブル内のSQLステートメントの実行時間を節約するプロシージャを作成する必要があります。

プロシージャはexec measuresqltime('sql statement as string');によって呼び出されています

私の考えは次のようなものです。

  --declarations 
  timestart NUMBER;
  BEGIN 
    dbms_output.enable; 
    timestart:=dbms_utility.get_time(); 
    EXECUTE IMMEDIATE sql
    COMMIT; 
    dbms_output.put_line(dbms_utility.get_time()-timestart); 
    -- save time

しかし、それは私にとってはうまくいきませんでしたSELECT *...句。 (SQLにはINTOオーダーが必要だと思います)

プロシージャ内でSQL-atatementsを実行する方法はありますか?

11
sheepy

SQLステートメントがSELECTの場合、実行時間の意味のある測定値を取得するには、カーソルからフェッチする必要があります。

カーソルからフェッチしない場合は、「解析」フェーズと「実行」フェーズで費やされた時間のみを測定しますが、作業の多くは通常、SELECTステートメントの「フェッチ」フェーズで実行されます。

実際のステートメントの列数がわからない場合は、EXECUTE IMMEDIATEまたはOPEN cursor FOR 'string'でフェッチすることはできません。 SELECTの列の数/タイプが不明な場合は、動的SQLパッケージ DBMS_SQL を使用する必要があります。

次に例を示します。

SQL> CREATE OR REPLACE PROCEDURE demo(p_sql IN VARCHAR2) AS
  2     l_cursor  INTEGER;
  3     l_dummy   NUMBER;
  4     timestart NUMBER;
  5  BEGIN
  6     dbms_output.enable;
  7     timestart := dbms_utility.get_time();
  8     l_cursor  := dbms_sql.open_cursor;
  9     dbms_sql.parse(l_cursor, p_sql, dbms_sql.native);
 10     l_dummy := dbms_sql.execute(l_cursor);
 11     LOOP
 12        EXIT WHEN dbms_sql.fetch_rows(l_cursor) <= 0;
 13     END LOOP;
 14     dbms_sql.close_cursor(l_cursor);
 15     dbms_output.put_line(dbms_utility.get_time() - timestart);
 16  END;
 17  /

Procedure created.

SQL> exec demo('SELECT * FROM dual CONNECT BY LEVEL <= 1e6');
744

PL/SQL procedure successfully completed.

これは、SELECTの最後の行にフェッチするのに必要な時間を測定することに注意してください。

16
Vincent Malgrat

devosJavaを完了すると答えました...夜明けに使用しないでください; P

PROCEDURE MY_PROCEDURE IS
  timeStart  TIMESTAMP;
  timeEnd    TIMESTAMP;
  timeSecond NUMBER
BEGIN
  timeStart  := SYSTIMESTAMP;

  -- YOUR CODE HERE

  timeEnd    := SYSTIMESTAMP;
  timeSecond :=((extract(hour from timeEnd)*3600)+(extract(minute from timeEnd)*60)+extract(second from timeEnd))-((extract(hour from timeStart)*3600)+(extract(minute from timeStart)*60)+extract(second from timeStart));
  dbms_output.put_line('finished: '||timeSecond||' seconds');
END MY_PROC;
4
Tiago Oliveira

実行時間の期間を計算するには

PROCEDURE MY_PROCEDURE IS
  timeStart  TIMESTAMP;
  timeEnd    TIMESTAMP;
BEGIN
  timeStart  := SYSTIMESTAMP;

  -- YOUR CODE HERE

  timeEnd    := SYSTIMESTAMP;

  INSERT INTO PROC_RUNTIMES (PROC_NAME, START_TIME, END_TIME)
    VALUES ('MY_PROCEDURE ', timeStart  , timeEnd    );
END MY_PROC;
1
devosJava

INSERT INTO PROC_RUNTIMES(PROC_NAME、START_TIME、END_TIME)VALUES( 'PROC_NAME'、TO_CHAR(SYSDATE、 'DD/MM/YYYY HH24:MI:SS')、NULL);

ここであなたの質問;

INSERT INTO PROC_RUNTIMES(PROC_NAME、START_TIME、END_TIME)VALUES( 'PROC_NAME'、NULL、TO_CHAR(SYSDATE、 'DD/MM/YYYY HH24:MI:SS'));

0
Ola