source

plsql의 프로시저에서 sql 문의 시간 측정

manysource 2023. 8. 23. 21:51

plsql의 프로시저에서 sql 문의 시간 측정

테이블에 있는 모든 sql-statement의 실행 시간을 절약하는 절차를 작성해야 합니다.

절차가 다음 시간에 호출됩니다.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은 TO-order가 필요할 것 같습니다)

절차에서 sql-atement를 실행할 수 있는 방법이 있습니까?

SQL 문이 SELECT이면 커서에서 가져와야 실행 시간을 의미 있게 측정할 수 있습니다.

커서에서 가져오지 않으면 "parse" 및 "execution" 단계에서 소요된 시간만 측정하는 반면 대부분의 작업은 일반적으로 SELECT 문에 대한 "fetch" 단계에서 수행됩니다.

당신은 가지고 올 수 없을 것입니다.EXECUTE IMMEDIATE또는OPEN cursor FOR 'string'실제 문에 포함될 열 수를 모르는 경우.SELECT의 열 수/유형을 알 수 없는 경우 동적 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의 마지막 행으로 가져오는 데 필요한 시간이 측정됩니다.

데보스를 완료하는 중 Java가 응답했습니다.새벽에 그것을 사용하는 것을 피하세요;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;

실행 시간의 기간을 계산하는 방법

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;

PROC_RUNTIMES(PROC_NAME, START_TIME, END_TIME) 값에 삽입('PROC_NAME', TO_CHAR(SYSDATE, 'DD/MM/YYYH24:MI:SS'), NULL);

여기 질문이 있습니다.

PROC_RUNTIMES(PROC_NAME, START_TIME, END_TIME) 값('PROC_NAME', NULL, TO_CHAR(SYSDATE, 'DD/MM/YYYH24:MI:SS');

언급URL : https://stackoverflow.com/questions/8939849/measure-time-of-an-sql-statement-in-a-procedure-in-plsql