h1.07.Sort Area 크기 조정
h3.(1)PGA 메모리 관리 방식의 선택
h3.(2)자동 PGA 메모리 관리 방식 하에서 크기 결정 공식
select a.ksppinm name, b.ksppstvl value
from sys.x$ksppi a, sys.x$ksppcv b
where a.indx = b.indx
and a.ksppinm = '_smm_max_size'
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
_smm_max_size
1048576
h3.(3)수동 PGA 메모리 관리 방식으로 변경 시 주의사항
h3.(4)PGA_AGGREGATE_TARGET의 적정 크기
h3.(5)Sort Area 할당 및 해제
select
round(min(decode(n.name, 'session pga memory', s.value))/1024) "PGA(KB)"
,round(min(decode(n.name, 'session pga memory max', s.value))/1024) "PGA_MAX(KB)"
,round(min(decode(n.name, 'session uga memory', s.value))/1024) "UGA(KB)"
,round(min(decode(n.name, 'session uga memory max', s.value))/1024) "UGA_MAX(KB)"
from v$statname n, v$sesstat s
where (name like '%uga%' or name like '%pga%')
and n.statistic# = s.statistic#
and s.sid = &SID
alter system set pga_aggregate_target = 24M;
create table t_emp
as
select *
from emp, (select rownum no from dual connect by level <= 100000);
emp 테이블을 10만 번 복제한 t_emp 테이블을 생성했다.
order by 절을 포함하는 아래 쿼리문이 수행될 대 PGA, UGA 크기가 어떻게 달라지는지 측정해보자.
select * from t_emp order by empno;
위 쿼리문이 수행되는 동안 다른 세션에서 아래 4단계로 나눠 측정하면된다. 참고로, 쿼리 완료 시점과 커서를 닫는 시점을 구분해 측정하려면,
사용자의 명시적인 요청이 있을 때만 Fetch를 진행하는 TOAD, Orange, PL/SQL Developer 같은 툴을 사용하는 것이 편하다.
**최초 : 쿼리 수행직전
**수행 도중 : 쿼리가 수행 중이지만 아직 결과가 출력되지 않은 상태
**완료 후 : 겨로가를 출력하기 시작했지만 데이터를 모두 Fetch하지 않은 상태
**커서를 닫은 후 : 정렬된 결과집합을 끝까지 Fetch 하거나 다른 쿼리를 수행함으로써 기존 커서를 닫은 직후
측정 결과를 표로서 요약하면 아래와 같다.
단계 | PGA(KB) | PGA_MAX(KB) | UGA(KB) | UGA_MAX(KB) |
---|---|---|---|---|
최초 | 376 | 632 | 153 | 401 |
수행도중 | 5,560 | 6,584 | 4,308 | 5,331 |
완료후 | 3,000 | 6,584 | 2,774 | 5,331 |
커서를 닫은 후 | 376 | 6,584 | 153 | 5,331 |
PGA와 UGA를 각각 6,584KB, 5,331KB만큼 사용했지만 커서를 닫은 직후에는 모두 반환한다는 사실을 위 표를 통해 알 수 있다.
'수행 도중'과 '완료 후'에 UGA, PGA 크기가 Max 값을 밑도는 이유는, 소트해야할 총량이 할당받을 수 있는 Sort Area 최대치를 초과하기 때문이다.
그때마다 중간 결과집합(Sort Run)을 디스크에 저장하고 메모리를 반환했다가를 필요한 만큼 다시 할당받는다는 사실을 알 수 있다.
alter session set workarea_size_policy = MANUAL;
alter session set sort_area_size = 52428800;
alter session set sort_area_retained_size = 52428800;
아래 표는 같은 쿼리를 수행하면서 각 단계별로 PGA, UGA 크기 변화를 측정한 것이다.
단계 | PGA(KB) | PGA_MAX(KB) | UGA(KB) | UGA_MAX(KB) |
---|---|---|---|---|
최초 | 376 | 6,584 | 153 | 5,331 |
수행도중 | 48,760 | 52,792 | 43,049 | 47,077 |
완료후 | 4,792 | 52,792 | 4,315 | 47,077 |
커서를 닫은 후 | 440 | 52,792 | 153 | 47,077 |
pga_aggregate_target을 24MB로 설정한 상태에서 한 세션의 Sort Area 크기가 50MB까지 도달했다.
manual 모드로 설정한 프로세스는 파라미터의 제약을 받지 않음을 알 수 있다.