ORACLE 10g v$sysstat v$sesstat
from
1.
ORACLE PERFORMANCE VIEW
ORACLE 상태를
보는데 있어 VIEW 는 굉장히 유용하다. 이런 정보는 전체적으로 STAT 정보가 있고 EVENT 정보가 있다. 여기서는 STAT 정보를 가지고 이야기 하려 한다.
STAT 은 STATISTIC 정보를 말하며 각 세션에 대해 혹은 시스템에 대해 수집된다.
EVENT 정보와 다른 점은 EVENT 의 경우 발생중 조회가 가능하며 IDLE 상태일 때 볼수가 없는 반면 STATISTIC 정보는 SESSION 의 활동여부와 상관없이 조회할 수 있다.
STAT 을 볼 수
있는 대표적인 VIEW 로는 V$STATNAME 과 V$SYSSTAT, V$SESSTAT 이 있다. v$sesstat 은 session level 의 statistic 정보이고 v$sysstat 은 system level 의 정보이다. v$statname 은 stat 의 고유번호에 대해 name 정보를 가지고 있다. v$sysstat 은 name 을 가지고 있기 때문에 조인이 필요 없으나 v$sesstat 은 name column 이 없기 때문에 v$statname 과 조인해야
한다.
STATISTIC 에 대한 VALUE 값을 볼 때 주의할 점이 있다. 그것은
해당 값이 누적값이라는 것이다. 그렇기에 실시간 모니터링용으로 스크립트를 만들려면 델타값(차이)을 구할 장치가 필요하다.
2.
대표적인 STATISTIC
어디까지나 개인적인 생각으로 다음과 같은 STATISTIC 정보가
유용하다고 생각한다.
-
SESSION
LOGICAL READS
-
PHYSICAL
READS
-
PARSE
COUNT (HARD)
-
EXECUTE
COUNT
각 STAT 에 대해 그 의미와 선택한 이유를 간단히 이야기 하면 아래와 같다.
<SESSION LOGICAL READS
SESSION 의 논리적 읽기 ( 메모리->CPU ) 를 알 수 있다. 이 값의 일정시간 당 델타값이 증가한 다는 것은 일량이 증가하고 있다고 해석하면 된다. 여기서 이상징후를 확인하면 해당 SID 에 대해 TRACE 라던가 수행 쿼리를 조회하는 행동으로 연계할 수 있다.
<PHYSICAL READS>
SESSION 의 물리적 읽기 ( 디스크->메모리 ) 를
알 수 있다. 이 값이 증가하면 증가할 수록 디스크의 I/O 가
많이 발생한다. 이와 관련해 I/O 관련 WAIT EVENT 들이 관측될 수 있다. SESSION LOGICAL
READS 와 마찬가지로 많이 유발하는 SID 를 찾아 추가적인 조치를 취할 수 있다.
<PARSE COUNT (HARD)>
이것은 순전히 LITERAL SQL 수행을 잡아내기 위한 방편이다. 이 지표는 상황에
따라 SYSTEM | SESSION
LEVEL 로 조회해야 한다. 이를테면 순간적으로 세션을 맺고 LITERAL SQL 을 수행하고 빠지는 세션이 많은 경우엔 SYSTEM
LEVEL 로 봐야 시스템에 HARD PARSING 이 많이 발생하고 있다는 것을 알 수
있을 것이다.
<EXECUTE COUNT>
이 지표는 SQL 을 수행한 수를 의미한다. (RECURSIVE CALL 제외) 시스템의 활동성을 의미한다. 보통 급증보다 급감하는 경우에 이슈가
있는 경우가 있다. (시스템이 IDLE 인 경우를 제외)
그밖에도
개인의 취향에 맞게 추가/제거 하면 된다. 하지만 지표가
너무 많아지면 가독성이 떨어지기 때문에 적당히 넣는게 좋다.
3.
v$sysstat
select
sum(decode(name, 'session logical
reads',value,0)) sread,
sum(decode(name, 'physical reads',value, 0))
pread,
sum(decode(name, 'parse count (hard)',value,
0)) pcount,
sum(decode(name, 'execute count',value, 0))
exec,
sum(decode(name, 'seq',value, 0)) "db
file seq",
sum(decode(name, 'scatt', value, 0)) "db
file scatt"
from
(select name,value from v$sysstat
where name in ('session logical
reads','physical reads','execute count','parse count (hard)','db file
sequential reads')
union all
select 'seq',nvl(sum(seconds_in_wait),0) from
v$session_wait
where event ='db file sequential read'
union all
select 'scat',nvl(sum(seconds_in_wait),0)
from v$session_wait
where event ='db file scattered read')
/
아까 언급한 stat 의 4가지
정보에 wait 2가지를 추가했다. wait 에 대해서는
후일에 이야기 하겠다. wait event 는 system level
의 정보가 없기 때문에 session level 에서
sum 하여 가져온다.
위 script 를 가지고 후에 개조 예정이다. 현재의 정보를 보면 delta 값을 구하기 위한 장치가 없다. 보통 이 부분을 쉽게 하는 것은 variable 을 사용해 구하는
방법이 있다.
select-list 에 decode 를 사용한 것은 정보가 rows 로
늘어서 있으면 delta 값을 구할 때 골치아프기 때문이다.
4.
v$sesstat
col program for a20
col module for a20
col name for a20
prompt 1: logical reads(default) 2 : physical reads 3 : parse count (hard) 4 : execute count(exec)
select a.sid,
vss.program,
vss.module,
a.name,
value from (
select vst.sid,vst.value,vsn.name,vsn.statistic#
from v$statname vsn, v$sesstat vst
where vsn.statistic# = vst.statistic#
and vst.statistic# in (9, 54, 331, 334)
and vsn.name =
decode(nvl(&1, 1),
1, 'session logical reads',
2, 'physical reads',
3, 'parse count (hard)',
4, 'execute count',1)
order by vst.value desc) a, v$session vss
where a.sid = vss.sid
and rownum < 6
/
위 스크립트는 system level 로 이상징후를 포착 후 session level 로 다가선다는 흐름을 가정하고 만들었다. 이상이
있는 지표에 대해 선택할 수 있게 decode 를 사용해
filtering 하게 만들었다. 여기서 확인할 수 있는 정보는 특정 sid 의 program, module 이 무엇이고 해당 stat 에 대해 얼마만큼의 누적치를 발생시켰는지이다.
참고로 여기서도 delta 값은 미구현 상태이다. 이에 대한 구현 방법은 v$sysstat 의 경우와 동일하다.
사실 이렇게 보는 것 보다 한번에 여러 스탯의 delta 치를
보여주는게 더 좋을 것 같기도 하다만 (요즘에는 active
session 이 그리 많지가 않다.) 뭐 사용하면서 개선하는게 좋지 않을까 해서 그대로
진행해 보려 한다.
script 의 개조
이력에 대해서는 다른 글에서 다시 이야기 하겠다.