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
'source' 카테고리의 다른 글
RMariaDB: MySQL에 연결할 때 caching_sha2_password 오류가 발생했습니다. (0) | 2023.08.23 |
---|---|
SVG를 유사 요소의 내용으로 사용하는 방법이 있습니까 ::before 또는 ::fore (0) | 2023.08.23 |
ORA-00917: 쉼표 오류 누락 (0) | 2023.08.23 |
sqlldr을 사용하여 원격 DB에 데이터 로드 (0) | 2023.08.23 |
오라클 SQL 개발자 도구를 사용하여 테이블의 필드에 null 값을 설정하는 방법은 무엇입니까? (0) | 2023.08.18 |