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 해야하기 때문에 당연히 부하를 줄 수 밖에 없습니다. 이걸 감안하고 사용해야 합니다.
'IT관련' 카테고리의 다른 글
오라클 Parallel DML 처리 방법 및 주의 사항 - enable parallel dml (0) | 2019.09.10 |
---|---|
오라클 에러 정보 (ORA-28002) - the password will expire within (0) | 2019.09.10 |
Oracle DB Startup nomount 안되는 경우, Hang - 버추얼박스(VirtualBox) (0) | 2019.09.08 |
오라클 Object 생성 SQL 보기, DDL 스크립트 추출 - 테이블, 인덱스, 뷰, 함수, 프로시져, 시퀀스 (0) | 2019.09.06 |
오라클 파티션 인덱스 (Partition Index) 관련 팁, FAQ 정리 (0) | 2019.09.05 |