오라클 쿼리 실행 시간

출처 : http://mainia.tistory.com/769



1. SET TIMING ON 사용하기 

 


간혹 Stored Procedure 실행시 쿼리의 구간 별 시간을 알고

싶을 때가 있습니다. 전체 SP 수행 시간은 Object 테이블을 뒤져서

보면 되는데 각 단계별로 out print 를 찍으면서 보고 싶을 때

SET TIMING ON 을 사용하면 됩니다.

 

Set timing on; timing start 로 시작하고 timing stop

마무리를 하면 됩니다. 그럼 그 시간이 측정되어 로그에

찍히게 됩니다.

 
Execute as Script (F5) 로 실행

SET TIMING ON;

TIMING START;
SELECT * FROM DUAL;
TIMING STOP;

TIMING START;
SELECT * FROM DUAL;
TIMING STOP;




Toad Menu > View > Query Viewer 를 사용해도 된다.
Execute Statement (F9) 로 실행해야 보임


  

2. DBMS_UTILITY.GET_TIME 사용하기  

 

다른 방법은 DBMS_UTILITY.GET_TIME 을 사용하는 방법입니다.

현재시간을 리턴하게 되므로 쿼리 실행후 그 차이 값을 계산하는

방법입니다. 이것이 더 불편할거 같아요.

변수를 선언하고 그 변수에 현재 시간을 저장한 후 마지막에

값을 연산해서 초로 계산하게 되는 것이다. GET_TIME

100분의 1초를 리턴하게 됩니다.

DELARE
  START_TIME NUMBER;
  END_TIME NUMBER;
BEGIN

  START_TIME := DBMS_UTILITY.GET_TIME;
  SELECT *
    FROM DUAL;
  END_TIME := DBMS_UTILITY.GET_TIME;
  
  SELECT (:END_TIME - :START_TIME)/100 ELAPSE_TIME FROM DUAL;
END;


 

======================================================================


ORACLE서버에서 수행시간이 긴 쿼리 찾기 쿼리


SELECT ROWNUM NO,
       PARSING_SCHEMA_NAME,
       to_char(ELAPSED_TIME/(1000000 * decode(executions,null,1,0,1,executions)),999999.9999 ) 평균실행시간,
       executions 실행횟수,
       SQL_TEXT 쿼리 ,
       SQL_FULLTEXT
  FROM V$SQL
 WHERE  LAST_ACTIVE_TIME > SYSDATE-(1/24*2)
   -- AND LAST_ACTIVE_TIME  BETWEEN  to_Date('20111226163000','YYYYMMDDHH24MISS') AND to_Date('20111226170000','YYYYMMDDHH24MISS')
   -- AND ELAPSED_TIME >= 1 * 1000000 * decode(executions,null,1,0,1,executions)
   and PARSING_SCHEMA_NAME = 'ZIPCODE'
 ORDER BY 평균실행시간 DESC, 실행횟수 DESC;


SELECT TO_CHAR (SID) sid, serial# serialNumber,
       SUBSTR (TO_CHAR (last_call_et), 1, 6) executeSeconds, userName, machine,
       b.sql_text sqlText
  FROM v$session a, v$sqltext b
 WHERE username NOT IN ('SYSTEM', 'SYS')
   AND a.TYPE != 'BACKGROUND'
   AND a.status = 'ACTIVE'
   AND a.sql_address = b.address(+)
   AND a.sql_hash_value = b.hash_value(+)
  ORDER BY a.last_call_et DESC,  a.SID, a.serial#, b.address, b.hash_value, b.piece



현재 실행되고 있는 쿼리 와 실행 시간

SELECT TO_CHAR (SID) sid, serial# serialNumber,
   SUBSTR (TO_CHAR (last_call_et), 1, 6) executeSeconds, userName, machine,
   b.sql_text sqlText
  FROM v$session a, v$sqltext b
  WHERE username NOT IN ('SYSTEM', 'SYS')
   AND a.TYPE != 'BACKGROUND'
   AND a.status = 'ACTIVE'
   AND a.sql_address = b.address(+)
   AND a.sql_hash_value = b.hash_value(+)
  ORDER BY a.last_call_et DESC,
   a.SID,
   a.serial#,
   b.address,
   b.hash_value,
   b.piece

+ Recent posts