测量plsql中过程中sql语句的时间

时间:2012-01-20 10:19:38

标签: oracle plsql procedure

我必须编写一个程序,将任何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?

4 个答案:

答案 0 :(得分:14)

如果您的SQL语句是SELECT,则需要从游标中获取以对其执行时间进行有意义的度量。

如果不从光标中获取,则只测量“解析”和“执行”阶段所花费的时间,而大部分工作通常在SELECT语句的“获取”阶段完成。

如果您不知道实际语句将包含的列数,则无法使用EXECUTE IMMEDIATEOPEN 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的最后一行所需的时间。

答案 1 :(得分:4)

完成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;

答案 2 :(得分:1)

计算执行时间的持续时间

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;

答案 3 :(得分:0)

INSERT INTO PROC_RUNTIMES(PROC_NAME,START_TIME,END_TIME)     价值观(&#39; PROC_NAME&#39;,TO_CHAR     (SYSDATE,&#39; DD / MM / YYYY HH24:MI:SS&#39;),NULL);

您的查询;

INSERT INTO PROC_RUNTIMES(PROC_NAME,START_TIME,END_TIME)     价值观(&#39; PROC_NAME&#39;,NULL,TO_CHAR     (SYSDATE,&#39; DD / MM / YYYY HH24:MI:SS&#39;));