버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

PGA와 UGA

...

영역

PGA는 특정 프로세스에 의해 할당된 그 프로세스만을 위한 메모리 영역이다. 이 메모리 영역에는 영역은 다른 프로세스가 접근하는 것이 불가능한, 할당 받은 프로세스만이 사용할 수 있는 영역이된다.
즉, Shared Memory 영역에 자리잡게되는 SGA공간과는 별개의 영역으로 자리잡게된다.

UGA는 세션 정보가 저장되는 영역이다. 따라서 특정 세션에서 특정 UGA 영역에 언제든 접근 가능해야 한다.
그러한 이유로 오라클 접속 방식이 어떻게 설정 되어있는지에 따라 UGA영역이 자리잡는 위치가 달라지게 된다.

만약 접속 방식으로 dedicated server 방식을 선택하였다면, 사용자가 접속할 때 마다 (dedicated) 서버 프로세스가 생성되게 된다. 이 서버 프로세스 역시 메모리를 할당 받게 될 것이며, 이는 이 서버 프로세스의 고유한 메모리 영역, 즉, PGA 영역이 된다.
이때 사용자 프로세스와 직접 통신하는 역할을 하는 것은 (dedicated) 서버 프로세스가 되며, 이 세션 정보를 다른 프로세스와 공유할 필요가 없다. 따라서 dedicated server 방식으로 설정되어 있다면, PGA 영역 안에 UGA 영역이 자리잡게 된다.

그리고 만약 접속 방식으로 방식을 shared server 방식으로 설정하였다면, 사용자 프로세스는 (shared) 서버 프로세스와 직접 소통하게 되지 않는다.
사용자 프로세스는 dispatcher 프로세스와 통신을 하게 되며, 다시 dispatcher 프로세스가 실제로 작업해야되는 내용을 (shared) 서버 프로세스에 전달해주게 된다.
사용자에게 반납해야될 메세지 또한 서버 프로세스가 dispatcher에 전달을 해주게 되고, 사용자는 dispatcher로 부터 결과값을 받게 되는 것이다.
사용자의 요청사항이 서버 프로세스로 전달이 되고, 내부적인 동작을 마친 뒤의 결과값을 다시 서버 프로세스로부터 받아 온다라는 전체적인 동작 방식에는 차이가 없다.
단 shared server 방식을 사용하게되면 사용자 프로세스와, 서버 프로세스 사이에 dispatcher가 위치하게 되고, dispatcher와 서버 프로세스 사이의 IPC 통신이 필요하게 된다.
따라서 Shared Memory 영역에 자리잡고 있는 SGA 영역에 UGA 영역이 자리잡게 된다.

 

수동 PGA 메모리 관리

...

PGA_AGGREGATE_TARGET MEMORY_TARGET

 

수동 PGA 메모리 관리

SORT_AREA_SIZE : SORT_AREA_RETAINED_SIZE : HASH_AREA_SIZE :

자동 PGA 메모리 관리

수동으로 PGA 메모리를 관리할 경우, 아래와 같은 파라미터들이 PGA 크기에 가장 큰 영향을 준다.

SORT_AREA_SIZE : 정렬 작업이 사용하는 메모리 공간의 크기. 정렬 작업이 해당 사이즈 이상의 공간을 필요로 하게되는 경우 디스크에서 정렬 작업이 이루어진다.
SORT_AREA_RETAINED_SIZE : 정렬된 작업이 완료된 이후에, 정렬된 데이터를 보관하기 위해 사용되는 메모리 영역. 정렬된 데이터의 사이즈가 해당 파라미터를 통해 지정된 사이즈 이상으로 크다면, 나머지 데이터는 템포러리 테이블스페이스에 저장된다.
HASH_AREA_SIZE : 해시 테이블을 저장하는데 사용되는 메모리 공간의 크기. 해시 조인등의 작업이 발생할 때에 사용된다.

 

SORT_AREA_SIZE 값에 따라, 정렬 작업시 PGA, UGA 및 디스크 사용량이 어떻게 변경되는지 확인해보기 위한 간단한 테스트를 진행한다. 

일단 아래와 같은 임시 테이블을 생성한다. 

코드 블럭
sys@MHORA11G> create table imsi as select * from  all_objects;
Table created.
sys@MHORA11G> exec dbms_stats.gather_table_stats(user,'IMSI');
PL/SQL procedure successfully completed.
sys@MHORA11G> exit

그리고 테스트에 사용할 스크립트를 생성한다. 

코드 블럭
[oracle@MHORA11G1 oratest]$ cat imsi.sql 
connect / as sysdba
set serveroutput off
set echo on
column sid new_val SID
select sid from v$mystat where rownum=1;
alter session set workarea_size_policy=manual;
alter session set sort_area_size = &1;
prompt 다른 세션을 하나 더 연결하고 @reset_stat &SID 를 실행 후, @watch_stat 를 실행하세요. 완료 후 현재 세션에서 Enter를 입력하세요.
pause
set termout off
select * from imsi order by 1, 2, 3, 4;
set termout on
prompt 다른 세션에서 @watch_stat 을 실행하세요.
pause

스크립트에 대해 간단히 설명하면, 
  새로 연결을 맺은 뒤, 
  해당 세션의 SID를 확인하고,
  해당 세션 내에서 workarea_size_policy=manual로 변경, 즉 pga_aggregate_target 파라메터를 무시하고, 수동으로 PGA 사이즈를 조정하도록 변경하고,
  해당 세션 내에서 sort_area_size를 스크립트 실행시 지정해준 값으로 변경한다.
  그리고 조금전에 생성해놓은 임시 테이블을 조회하되, 정렬 작업을 발생시키고, 
    테스트를 진행하는 사용자는 세션을 하나 더 열어 둔 뒤, 변화량을 측정할 수 있도록 한다.

테스트를 진행할 때에 오라클 세션을 2개 접속해 두어야 하고, 
 한 쪽 세션에서는 @imsi 65536 과 같은 식으로 스크립트를 실행해 주고,
 화면에 출력되는 메세지에 딸, 다른 쪽 세션에 접속하여 @reset_stat SID , @watch_stat 스크립트를 실행해 보도록 한다. 

reset_stat 스크립트와, watch_stat 스크립트의 내용은 각각 좌측의 링크를 통해 확인해보도록 한다.  

우측과 같이 실행하여, sort_area_size를 각각 64KB, 1MB, 1GB로 잡아두고 테스트를 진행한다. @imsi 65536, @imsi 1048576, @imsi 1073741820

서식 미적용
-- 이 란에서는 결과값만 요약해 두었다.
@imsi 65536 수행시, 
NAME                                                             KBYTES_WRITES DIFF_KBYTES_WRITES
---------------------------------------------------------------- ------------- ------------------
physical reads direct temporary tablespace                                6246               6246
physical writes direct temporary tablespace                               6246               6246
session pga memory                                                        2324               1600
session pga memory max                                                    2580               1856
session uga memory                                                         370                128
session uga memory max                                                     434                192


@imsi 1048576 수행시,
NAME                                                             KBYTES_WRITES DIFF_KBYTES_WRITES
---------------------------------------------------------------- ------------- ------------------
physical reads direct temporary tablespace                                1247               1247
physical writes direct temporary tablespace                               1247               1247
session pga memory                                                        2132               1408
session pga memory max                                                    4308               3584
session uga memory                                                         242                  0
session uga memory max                                                    2387               2145


@imsi 1073741820 수행시,
NAME                                                             KBYTES_WRITES DIFF_KBYTES_WRITES
---------------------------------------------------------------- ------------- ------------------
physical reads direct temporary tablespace                                   0                  0
physical writes direct temporary tablespace                                  0                  0
session pga memory                                                         724                  0
session pga memory max                                                   12564              11840
session uga memory                                                         242                  0
session uga memory max                                                   11946              11703


-- SORT_AREA_SIZE를 점점 더 크게 잡을 수록, PGA 사이즈가 훨씬 크게 증가되는 것을 확인할 수 있다. 반면 디스크 사용량은 크게 줄어들어, 1GB로 잡았을 경우에는 정렬에 사용 가능한 메모리 공간이 충분하기에 정렬 작업이 메모리 내에서만 발생하여 디스크는 사용되지 않았다는 것을 확인할 수 있다. 
-- 또한 sore_area_size가 1GB로 잡혔을 때에도, PGA 사이즈가 1GB 이상으로 커지지 않는 것을 보면, SORT_AREA_SIZE는 최대 값에 해당할 뿐, 정렬시 무조건 SORT_AREA_SIZE만큼씩 할당해 주는 것은 아님을 확인할 수 있다.
-- 다만 64KB로 놓았을 경우에, 교재의 경우 PGA사이즈가 정확히 64KB 증가하는 모습을 보이나 실제 테스트시엔 몇번을 반복하여도 64KB 이상으로 커지는 것으로 보인다. PGA영역이 반드시 정렬 작업에만 사용되는 것은 아니므로, 여타의 작업들이 PGA 사용량을 증가시킨 것으로 보인다.
-- 그리고 교재에 따르면 쿼리가 완료된 이 후에 PGA 공간이 초기화 된다고 하나 이 또한 확인이 불가능하였다. 환경에 따라 다소 결과가 달라지는 듯 하니 정확한 이유를 파악하여 향후에 추가하도록 하겠다.

 

 

자동 PGA 메모리 관리

[[ 시스템 전체에서 얼마나 많은 메모리를 사용할 수 있도록 할 것인지를 오라클에 지시 ]]

사용 편의성 수동 할당은 '하나를 결정하면 모든 것을 만족시킨다' 전략 메모리 제어

...

수동/자동 메모리 관리기법의 선택


PGA와 UGA 요약

[[ 지금까지 두 가지 메모리 구조(PGA,UGA)에 대해 살펴보았다. 이제 PGA가 특정 프로세스의 전용 공간임을 이해했을 것이다. PGA는 오라클 dedicated server나 shared server가 세션에 독립적으로 존재하기 위해 필요한 다양한 요소들의 집합이다. PGA는 힙 형태의 메모리 구조다. UGA 또한 힙 형태의 메모리 구조로서 다양한 형태로 세션과는 종속적인 구조로 정의할 수 있다. dedicated server 접속 방식으로 오라클에 접속할 때 사용하는 PGA 안에 UGA가 위치해 있게 되고, shared server접속 방식의 경우에는 UGA는 SGA 안에 위치하게 된다.