본문 바로가기

IT관련

오라클 v$sql 에서 방금 실행한 SQL 확인하는 방법

Oracle DB 에서 실행한 SQL 내역을 조회하고자 할때 v$sql 딕셔너리뷰를 이용할 수 있습니다.

v$sql 에는 이전에 실행한 SQL 문실행 시작시간, 종료시간, 경과시간 등의 정보가 들어있습니다.

 

아래는 'SCOTT' 유저에서 실행한 SQL 들에 대해서만 정보를 조회합니다.

코멘트(--)로 막아놓은 부분처럼 not in 을 써서 내부 SQL 들만 제외하고 전체를 조회할 수도 있습니다.

 


SQL>
set linesize 200
col first_load_time for a20
col last_load_time for a20
col elapsed_time for 999,999,999,999
col sql_text for a50

select sql_id,
       parsing_schema_name,
       first_load_time,
       last_load_time,
       elapsed_time,
       substr(sql_text,1,50) as sql_text
from v$sql
-- where parsing_schema_name not in ('SYS','SYSTEM','DBSNMP')
where parsing_schema_name in ('SCOTT')
order by last_load_time
;

 

실행결과는 아래와 같습니다.

 

 

sql_text 컬럼에 SQL문장이 들어있는데, 위에서는 50자 까지만 잘라서 조회했습니다.

substr() 함수를 제거하고 조회하면 최대 1000자 까지의 SQL문장을 조회할 수 있습니다.

SQL문장이 1000자가 넘어가는 경우는 v$sql 에 있는 다른 컬럼인 sql_fulltext 컬럼을 조회하면 됩니다.

이 컬럼은 clob 타입으로 되어 있습니다.

 

first_load_time 이 실행 시작시간, last_load_time 이 실행 완료시간, elapsed_time 은 경과시간입니다.

이때, elapsed_time 이 1초단위가 아니라 micro second 입니다. 백만분의1초 입니다. 

즉, elapsed_time 이 1,000,000 값이 나오면 이게 1초 입니다.

위의 경우는 모두 1초 이내로 끝난 것입니다.

 

v$sql 을 이용할 때 주의할 점은 모든 SQL이 다 v$sql 에 들어가는게 아니라는 것입니다.

SQL문장이 조금이라도 달라지는 경우는 v$sql 에 들어가지만, 같은 SQL이 여러번 실행되는 경우는 처음 1번만 들어갑니다.

따라서 이 v$sql 뷰를 audit(감사) 용도로 사용해서는 안됩니다.

 

모든 SQL의 실행내역을 로그 남기듯이 하려면 Oracle DB 에서 무료로 이용할 수 있는 audit_trail 기능을 세팅해서 이용하면 됩니다.

하지만, 이 기능은 DB에 부하를 준다는 것이 문제입니다. 모든 사용자의 SQL 실행내역을 다 남기려면 그만큼 더 많은 정보를 어딘가에는 Writing 해야하기 때문에 당연히 부하를 줄 수 밖에 없습니다. 이걸 감안하고 사용해야 합니다.