본문 바로가기

wow db Log/oracle

Hard parse 발생량 및 세션 검사

shared pool과 library cache 래치에 대한 경합은 대부분 과다한 하드 파싱(hard parsing)에 의해

발생된다. 하드 파스(hard parse)는 새로운 커서를 수행하거나 라이브러리 캐시에서 밀려난(age out) 커서들을 재수행할 때 발생된다.

과다한 하드 파싱은 일반적으로 상수(literal)값을 가지고 SQL문을 사용하는 애플리케이션에서 발생한다. 하드파스는 매우 비싼 오퍼레이션이며, 파스(parse)를 수행하는 동안 child library cache 래치를 소유하고 있어야 한다. --> SQL문을 찾아 바인딩 변수로 변경을 권고한다.


-- 하드파싱의 발생량
select a.*, sysdate - b.startup_time days_old
   from v$sysstat a, v$instance b
where a.name like 'parse%';
 
-- 과다한 하드 파스를 수행하는 현재 세션 확인
 select a.sid, c.username, b.name, a.value,
          round((sysdate - c.logon_time) * 24) hours_connected
   from v$sesstat a, v$statname b, v$session c
where c.sid = a.sid
   and a.statistic# = b.statistic#
   and a.value > 0
   and b.name = 'parse count (hard)'
order by a.value desc;


-- liternal SQL 식별 쿼리

select hash_value, substr(sql_text, 1, 80) --> 40글자가 동일한 SQL문을 찾는다.
   from v$sqlarea
where substr(sql_text,1,40) in (select substr(sql_text,1,40)
                                               from v$sqlarea
                                            having count(*) > 4
                                            group by substr(sql_text,1,40))
order by sql_text;