Oracle 데이터베이스에서 현재 실행 중인 SQL 세션 정보를 조회하는 방법을 소개합니다.
이를 통해 세션 모니터링, 성능 분석, 트러블슈팅을 효과적으로 수행할 수 있습니다.
1. 현재 활성 세션 조회
현재 실행 중인 SQL 세션을 확인하려면 다음 SQL을 실행하세요.
SELECT SID, SERIAL#, USERNAME, STATUS, MACHINE, PROGRAM, LOGON_TIME
FROM V$SESSION
WHERE STATUS = 'ACTIVE';
컬럼 설명
- SID : 세션 ID
- SERIAL# : 세션 고유 번호
- USERNAME : 오라클 사용자
- STATUS : 세션 상태 (ACTIVE, INACTIVE 등)
- MACHINE : 접속한 클라이언트 머신
- PROGRAM : 실행 중인 프로그램
- LOGON_TIME : 세션 시작 시간
이 SQL을 사용하면 현재 활성화된 세션 리스트를 빠르게 조회할 수 있습니다.
2. 특정 세션의 실행 중인 SQL 조회
특정 세션에서 실행되고 있는 SQL 문을 조회하려면 다음 SQL을 사용합니다.
SELECT S.SID, S.SERIAL#, S.USERNAME, S.STATUS, Q.SQL_TEXT
FROM V$SESSION S
JOIN V$SQL Q ON S.SQL_ID = Q.SQL_ID
WHERE S.STATUS = 'ACTIVE';
설명
- V$SESSION 뷰와 V$SQL을 조인하여 현재 실행 중인 SQL을 조회
- SQL_TEXT 컬럼을 통해 실제 실행 중인 SQL 문장 확인 가능
이를 통해 특정 사용자의 실행 SQL을 추적하고 문제 발생 시 디버깅할 수 있습니다.
3. 실행 중인 SQL의 실행 계획(Execution Plan) 확인
SQL 실행 계획을 조회하려면 아래 SQL을 실행하세요.
SELECT S.SID, S.SERIAL#, Q.SQL_ID, Q.PLAN_HASH_VALUE, T.OPERATION, T.OPTIONS
FROM V$SESSION S
JOIN V$SQL_PLAN T ON S.SQL_ID = T.SQL_ID
JOIN V$SQL Q ON S.SQL_ID = Q.SQL_ID
WHERE S.STATUS = 'ACTIVE';
컬럼 설명
- PLAN_HASH_VALUE : 실행 계획 해시값
- OPERATION : 실행 단계 (예: TABLE ACCESS, INDEX SCAN 등)
- OPTIONS : 실행 옵션 (예: FULL, RANGE SCAN 등)
SQL 실행 계획을 확인하면 성능 최적화 및 SQL 튜닝에 도움을 줄 수 있습니다.
4. 특정 세션 강제 종료(Kill Session)
불필요하거나 문제가 발생한 세션을 종료하려면 다음 SQL을 실행하세요.
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
사용 예시
예를 들어, SID=1234이고 SERIAL#=56789인 세션을 종료하려면:
ALTER SYSTEM KILL SESSION '1234,56789' IMMEDIATE;
⚠ 주의사항:
세션 강제 종료 시 연결된 트랜잭션이 롤백될 수 있으므로 신중하게 사용해야 합니다.
5. 테스트
수행되는 SQL 세션 정보를 확인하는 일반적인 방법으로 v$session가 v$process 뷰를 통해서 확인합니다.
SET LINESIZE 190
COLUMN spid FORMAT A10
COLUMN username FORMAT A15
COLUMN program FORMAT A65
SELECT s.inst_id,
s.sid,s.serial#,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
SQL> r
1 SELECT s.inst_id,
2 s.sid,s.serial#,
3 p.spid,
4 s.username,
5 s.program
6 FROM gv$session s
7 JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
8* WHERE s.type != 'BACKGROUND'
INST_ID SID SERIAL# SPID USERNAME PROGRAM
---------- ---------- ---------- ---------- --------------- -----------------------------------------------------------------
1 55 31855 14082 SYSTEM sqlplus@ora19c (TNS V1-V3)
1 56 65428 13890 APEX_PUBLIC_USE Oracle REST Data Services
R
1 299 41229 13897 APEX_PUBLIC_USE Oracle REST Data Services
R
1 66 13195 13895 APEX_PUBLIC_USE Oracle REST Data Services
R
1 290 24817 13909 ORDS_PUBLIC_USE Oracle REST Data Services
R
1 68 59732 13911 ORDS_PUBLIC_USE Oracle REST Data Services
R
1 307 59406 13913 ORDS_PUBLIC_USE Oracle REST Data Services
R
1 58 3033 13920 APEX_LISTENER Oracle REST Data Services
1 295 26742 13922 APEX_LISTENER Oracle REST Data Services
1 54 25653 13924 APEX_LISTENER Oracle REST Data Services
1 293 12521 13932 APEX_REST_PUBLI Oracle REST Data Services
C_USER
1 52 3346 13934 APEX_REST_PUBLI Oracle REST Data Services
C_USER
1 305 11563 13936 APEX_REST_PUBLI Oracle REST Data Services
C_USER
13 rows selected.
결론
Oracle 데이터베이스에서 현재 실행 중인 세션 정보를 조회하는 방법을 정리했습니다.
이를 활용하면 실시간 세션 모니터링, SQL 튜닝, 성능 분석, 문제 해결을 효과적으로 수행할 수 있습니다.