본문 바로가기

IT

[oracle] 현재 실행중인 SQL의 사용률이 높은 커서 보기


DB서버의 오라클 프로세스가 비정상적으로 증가됐다.


어떤프로세스에서 커서를 많이 사용하는지 조회해보자.

SELECT sid, count(sid) "cursor" 
FROM v$open_cursor
--WHERE user_name = 'SCOTT'
GROUP BY sid
order by "cursor" desc;

sid와 cursor값을 통해 어떤 sid가 커서가 가장높은지 확인할수 있다.


그리고 현재실행중인 SQL의 커서수를 확인하는 쿼리를 통해 어떤쿼리가 비정상적으로 많이 사용되는지 확인 후 

해당 쿼리가 포함된 소스를 체크해볼수 있다.

SELECT sql_text, count(sid) cnt 
FROM v$OPEN_CURSOR 
GROUP BY sql_text 
ORDER BY cnt DESC;

쉽게 얘기해서 CNT(커서수)가 가장 높은게 현재 실행중인 SQL의 호출량이라고 보면 되겠다.

저 쿼리가 포함된 소스를 찾아서 DB.CLOSE를 해주던, 쿼리를 손보면 좀..괜찮아 질듯 싶다.


그리고 아래처럼 현재 DB서버 프로세스에서 오라클 프로세스의 갯수와 정보를 확인한다.

오라클 DB서버 프로세스 증가를 추적하고 막아보자.


SELECT   /*+ rule */
         s.status "Status", s.serial# "Serial#", s.TYPE "Type",
         s.username "DB User", s.osuser "Client User", s.server "Server",
         s.machine "Machine", s.module "Module", s.terminal "Terminal",
         s.program "Program", p.program "O.S. Program",
         s.logon_time "Connect Time", lockwait "Lock Wait",
         si.physical_reads "Physical Reads", si.block_gets "Block Gets",
         si.consistent_gets "Consistent Gets",
         si.block_changes "Block Changes",
         si.consistent_changes "Consistent Changes", s.process "Process",
         p.spid, p.pid, s.serial#, si.sid, s.sql_address "Address",
         s.sql_hash_value "Sql Hash", s.action
FROM v$session s, v$process p, sys.v_$sess_io si
WHERE s.paddr = p.addr(+)
     AND si.sid(+) = s.sid
     AND s.username IS NOT NULL
     AND NVL (s.osuser, 'x') <> 'SYSTEM'
     AND s.TYPE <> 'BACKGROUND'
ORDER BY 3;