주요 SGA의 요소들

1) Fixed SGA

  • 플랫폼 및 릴리즈에 따라 그 크기가 다르다.
  • 설치시 컴파일되어 오라클 바이너리에 포함된다.
  • 여러 파라미터값을 담은 변수와 SGA의 다른 구성요소를 가리키는 변수 집합을 담고있다.
  • 크기는 제어불가능하지만, 무시할 수 잇을 정도로 크기가 아주 작다.
  • SGA의 다른 비트 혹은 조각을 찾기위해 오라클이 내부적으로 사용하는 영역이다.

2) 리두 버퍼

  • 리두의 내용을 디스크에 쓰기전에 보관하는 곳

Redo Buffer 가 LGWR에 의해 Online Redo Log File에 내려 써질 때

(1) 매 3초마다
(2) commit할 때마다
(3) LGWR에 로그 파일 스위치 요청이 있을 대
(4) 로그버퍼가 1/3찼거나 로그버퍼에 리두 로그데이터의 크기가 1MB가 됐을때
※9장. 리두와 언두에서 uncommitted 데이터를 데이터 파일에 기록하는것에대해 상세히 다룸

  • LOG_BUFFER 파라미터가 제어하는 리두 버퍼의 기본 크기는 운영체제, 데이터베이스 버전 및 여러 파라미터 설정등에 많은 영향을 받음
 
sys@BWD> alter system set log_buffer=1 scope=spfile;
System altered.
sys@BWD> startup force; --SGA=256m
sys@BWD> select value,isdefault from v$parameter where name = 'log_buffer';
VALUE      ISDEFAULT
---------- ---------
2044928    FALSE     --1.95MB
--SGA=1512mbsys@BWD> select value,isdefault from v$parameter where name = 'log_buffer';
VALUE      ISDEFAULT
---------- ---------
14246912   FALSE     --13.5MB

  • 기본 로그버퍼의 최소 크기는 SGA크기에 종속적

3) 블록 버퍼 캐시

  • 디스크로 쓰기 전, 그리고 디스크로부터 읽은 후의 데이터베이스 블록을 저장하는 공간

SGA에서 개별 세그먼트들을 따로 저장할 수 있는 세개의 저장공간.

(1) Default pool : 모든 세그먼트 블록들이 일반적으로 캐시되는 공간 buffer_cache_size 로 크기를 조정할 수 있다.
(2) Keep pool : default pool의 대안으로 주기적으로 아주 자주 액세스되는 세그먼트를 여기에 할당, 다른 세그먼트가 공간을 요구하면 오래된 블록은 default pool로 밀려난다. db_default_cache_size 로 크기를 조정할 수 있다.
(3) Recycle pool : default pool의 대안으로 주기적으로 큰 세그먼트를 아주 랜덤하게 액세스해서 다른 많은 블록들이 buffer flushing 되는경우에 그 세그먼트를 여기에 할당한다. 이런 세그먼트를 캐시에 담아 두어도 다른 블록에 의해서 밀려나서 나중에 찾을 경우 없다. Recycle pool에 있는 세그먼트로부터 그런 세그먼트를 분리시키면, 그 세그먼트의 블록이 캐시에서 밀려나지 않도록 할 수 있다. db_recycle_cahce_size 로 크기를 조정할 수 있다.

  • pool은 세그먼트들을 hot,warm,더이상캐시할필요없음으로 구분
    hot : Default pool에 있는 오브젝트들이다. 그리고 캐시 안에 머물기 충분하다는 뜻
    warm : 제법 빈번하게 사용되기는 하지만 아직은 hot 상태가 아닌 세그먼트들. 이런 세그먼트들의 블록들은 캐시에서 플러싱한 후에 드물게 사용하는 블록들을 위한 공간을 별로도 마련해줄 수 있다.
    warm 세그먼트 블록들을 캐시하기 위해서는 아래의 절차는 따른다.
    1. warm 세그먼트들을 keep pool에 할당하라. warm 블록들을 버퍼 캐시에 더 오래 남을 수 있도록 하는 조치.
    2. 캐시에 남겨두고 싶지 않은 세그먼들을은 Recycle pool에 할당함. Recycle pool의 크기를 적절히 작게 유지해서 블록이 캐시에 들어오고 나가는 것이 신속하게 이루어지고, 부하가 줄어든다.

버퍼 캐시 안에서 블록 관리하기

  • Dirty 블록리스트 : 캐시 내에서 변경되었지만 , 아직 디스크에 기록되지 않는 dirty 버퍼 블록들을 관리
  • non-dirty 블록리스트 :아직 dirty리스트로 옮겨지지 않은 나머지 버퍼블록들을 관리한다. LRU LIST라 불렸다.
  • 물리적인 순서에 대해 블록의 리스트를관리(8i이전) -> 지속적으로 블록을 엑세스하면 3초에 한번씩 블록과 관련된 카운터를 증가(X$테이블들에서 확인가능)
    X$BH테이블 :블록 버퍼 캐시 안에 있는 블록들에 대한 정보를 확인(v$BH 뷰보다 더많은 정보)

--demo4.sql
--다섯 개의 'currently hottest blocks'를 찾기위한 쿼리
select tch, file#, dbablk,                                --touch count, file번호, block번호 v$bh
      case when obj = 4294967295                          --특별한 블록들을 표시하기위해 사용된 매직넘버
           then 'rbs/compat segment'
           else (select max( '('||object_type||') ' ||
                       owner || '.' || object_name  ) ||
                   decode( count(*), 1, '', ' maybe!' )   --object가 하나일땐 '', 하나가아닐때 'maybe!'
                 from dba_objects                         --어느 오브젝트에 속해있는지 확인하기위해 dba_objects뷰와 조인
                 where data_object_id = X.OBJ )
       end what 
from (
select tch, file#, dbablk, obj
  from x$bh
 where state <> 0
 order by tch desc
      ) x
where rownum <= 5
/
       TCH      FILE#     DBABLK WHAT
---------- ---------- ---------- -------------------------
        89         13      94401 rbs/compat segment
        89         39     541737 rbs/compat segment
        88          1       9566 (TABLE) SYS.TS$ maybe! --아마 SYS.TS$ 사용
        88         31    3586609 rbs/compat segment
        88         13      94409 rbs/compat segment

--※인스턴스와 관련된 기초가 되는 블록들 확인
--select * from dba_extents where file_id=<FILE#> and block_id <=<DBABLK> and block_id+blocks-1 >= <DBABLK>
--select * from dba_extents where file_id=13 and block_id <=94401 and block_id+blocks-1 >= 94401 --엄청오래돔

select data_object_id, count(*)
  from dba_objects
 where data_object_id is not null
 group by data_object_id
having count(*) > 1;

DATA_OBJECT_ID   COUNT(*)
-------------- ----------
             6          3
           296          7
             8          3
           205          3
             2         17
            29          3
           215          2
           168          3
           514          2
            10          3

10 rows selected.

--DBA_OBJECTS에서 DATA_OBJECT_ID가 기본키가 아니기 때문에 X$BH와 DBA_OBJECT를 조인하여 클러스터에 있는 모든 오브젝트들의 리스트를 구할 수 있다.
 
--쿼리 실행 할 때마다 실제 DUAL 테이블을 액세스 할 것

select tch, file#, dbablk, DUMMY
  from x$bh, (select dummy from dual)
 where obj = (select data_object_id
                from dba_objects
               where object_name = 'DUAL'
                 and data_object_id is not null)

       TCH      FILE#     DBABLK D
---------- ---------- ---------- -
         1          1        534 X
         1          1        535 X

sys@BWD> /
       TCH      FILE#     DBABLK D
---------- ---------- ---------- -
         2          1        534 X
         2          1        535 X
sys@BWD> /
       TCH      FILE#     DBABLK D
---------- ---------- ---------- -
         2          1        534 X     -- TCH가 증가하지 않았다.
         2          1        535 X
sys@BWD> /
       TCH      FILE#     DBABLK D
---------- ---------- ---------- -
         3          1        534 X
         3          1        535 X
sys@BWD> /
       TCH      FILE#     DBABLK D
---------- ---------- ---------- -
         4          1        534 X
         4          1        535 X
 
--8i이상에서 블록 버퍼는 블록이 사용되었을 때 더 이상 리스트의 맨 앞으로 이동하지 않고 리스트 원래 있던 위치에 머무르게 하는대신, touch count 수를 증가
--시간이 지나면서 리스트 내에서 블록이 자연스럽게 이동(이동지점만관리)

4) 다중 블록 크기

과거에는 단일 데이터 베이스에 있는 모든 블록들은 크기가 같아야 했고, 다른 븐록 크기를 적용하기위해서는 전체 데이터베이스를 재생성해야만 했다.
오라클 9i부터 하나의 데이터베이스에서 복수의 데이터베이스 블록 크기를 사용할 수 있다. 디폴트 크기를 혼합하여 또 다른 네가지 블록크기로도 변경할 수 있다.
각각의 블록 크기를 갖는 그들만의 영역을 가져야한다. 데이터베이스에 non-default 블록 크기를 정의하기 위해서는 버퍼 pool이 각각의 블록들을 담을 수 있도록 설정해야 된다.
이런 다중 블록 크기는 transportable 테이블스페이스를 지원하기 위해 필요한 기능이다.
트랜잭션 위주의 시스템에서 데이터 파일을 가져올 때 블록 크기가 8kb고, 이동할 데이터 웨어하우스의 블록 크기가 16kb나 32kb일 때 효과적이다.
다중블록 크기는 데이터베이스간 데이터 이전이 주된 목적이고, 아마도 하이브리드 리포팅/ 트랜잭션 시스템에도 유리하다.



--demo5

create tablespace ts_16k
datafile '/tmp/ts_16k.dbf' 
size 5m
blocksize 16k;
show parameter 16k

ERROR at line 1:
ORA-29339: tablespace block size 16384 does not match configured block sizes

sys@BWD> alter system set sga_target = 256m scope=spfile;

System altered.

sys@BWD> alter system set db_16k_cache_size = 16m scope=spfile;

System altered.

sys@BWD> startup force
ORACLE instance started.

Total System Global Area  268435456 bytes
Fixed Size                  2083368 bytes
Variable Size             104859096 bytes
Database Buffers          159383552 bytes
Redo Buffers                2109440 bytes
Database mounted.
Database opened.
sys@BWD> show parameter 16k

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size                    big integer 32M
sys@BWD> 

 

5) Shared Pool

  • 많은 프로그램의 데이터 조각을 캐시하는 곳
  • PL/SQL코드 캐싱,공유
  • 쿼리파싱할 때 파싱된 표현식 저장
  • 시스템 파라미터 저장
  • 데이터 딕셔너리 캐시 저장
  • 보통 4kB이하 수많은 메모리 청크로 구성
  • LRU 알고리즘 기반으로 관리
  • DBMS_SHARED_POOL을 이용해서 shared pool동작방식 변경가능(shared pool에 강제로 오브젝트를 pin)


 sys@BWD> select sum(bytes) from v$sgastat where pool = 'shared pool';

SUM(BYTES)
----------      --92m   
  96476584

sys@BWD> show parameter shared_pool_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size                     big integer 80M

-- shared pool은 shared_pool_size 파라미터 범위 외에 많은 다른구조를 포함

-- 오라클10g이상에서 수동 SGA 메모리 관리방식을 사용한다면(shared_pool_size를 직접설정한다면) v$sgastat의 shared pool과 shared_pool_size값이 1:1로 대응된다.

 

6) Large Pool

  • shared pool에서 다룰 수 없을 만큼 큰 '메모리 조각'을 할당하는 데 사용
  • large pool은 recycle buffer pool과유사하고, shared pool은 keep buffer pool과 유사하다.
  • large pool이 사용되는 경우
    • shared server 커넥션 환경에서 SGA영역에 UGA를 할당
    • 병렬 실행문장에서 병렬 쿼리 서버의 조정자가 사용하는 interprocess message buffer를 할당하는데 사용
    • RMAN disk I/O버퍼의 백업

7) Java Pool

  • Java pool은 오라클 8.1.5에서 데이터베이스에서 자바 프로그램 실행을 돕기 위해 추가됨.
  • JAVA_POOL_SIZE를 이용해서 지정한 메모리는 지정된 모든 세견에 자바코드와 데이터를 Java pool에 할당된다.
  • Java pool은 운영하는 방식에 따라 다른 방식으로 이용
    • dedicated server : 각 세션이 실제로 이용하는 각각의 자바 클래스의 공유 파트를 포함. 이것은 기본적을 읽기 전용 파트이며 메모리는 크지 않다. 세션의 상태는 dedicated servser 모드에서는 SGA에 저장되지 않는다는 것이다.
    • shared server : 각 자바 클래스의 공유부분과 각각의 세션에서 각 세션의 상태에 사용하는 UGA의 그 어떤것. UGA의 나머지는 sharedpool의 일반적인 사항과 같이 위치하거나 large pool이 설정되어 있다면 이것 대신에 위치할 수 있다.오라클 10g 이상에서는 Java pool은 데이터베이스 재구동 없이 커지거나 줄어들 수 있다.

8) Stream Pool

  • 오라클 10g에서 시작된 새로운 SGA 구조.
  • Stream pool이 지정되어 있지 않다면 shared pool의 10%까지 할당(10% 무임승차를 방지하기위해 이영역을 설정)
  • 하나의 데이터베이스에서 다른 데이터베이스로 데이터를 moving/coping하느 stream process에 필요한 buffer queue message에 사용.
  • 디스크르 기반으로 둔 큐 기능을 사용함으로써 오버헤드가 발생하는 과거 데이터 이고나 방식에 비해 Stream은 in-memory큐를 사용. 오라클 인스턴스가 특정한 사유로인해 장애발생시 리두로그에셔 in-memory 큐를 재구성 할 것임.

9) 자동 SGA 메모리 관리

  • 10g 이후 버전부터 PGA,SGA 메모리방식에 각각 두가지 방식이 존재,
    • (1) SGA 모든구성pool과 캐시 파라미터를 수작업으로 설정하는 방식
    • (2) 몇개의 메모리 파라미터와 하나의 SGA_TARGET 파라미터를 설정하여 다양한 SGA컴포넌트들에 대한 크기조정을 자동으로하는 방식
  • 자동조정 SGA 파라미터 : DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE, JAVA_POOL_SIZE
  • 수동SGA 파라키터 : LOG_BUFFER, STREAMS_POOL, DB_NK_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE
  • V$SGAINFO를 통해 재종된 SGA 구성요소들 조회(10g)
  
sys@BWD> select * from V$SGAINFO;
  NAME                                  BYTES RES
  -------------------------------- ---------- ---
  Fixed SGA Size                      2083368 No
  Redo Buffers                        2109440 No 
  Buffer Cache Size                 155189248 Yes 
  Shared Pool Size                  100663296 Yes
  Large Pool Size                     4194304 Yes
  Java Pool Size                      4194304 Yes 
  Streams Pool Size                         0 Yes  
  Granule Size                        4194304 No   
  Maximum SGA Size                  268435456 No  
  Startup overhead in Shared Pool    79691776 No  
  Free SGA Memory Available                 0 
  11 rows selected.  

  • SGA메모리 관리를 자동화 하기위해서는 STATISTICS_LEVEL 파라미터를 TYPICAL이나 ALL로 설정(수집 된 통계정보로 메모리 크기 결정)
  • SGA_TARGET : 메모리 자동 조정 파라미터 1순위, 이파라미터를 통해 SGA_MAX_SIZE 파라미터에 설정된 크기까지 조정할 수 있다(SGA_TARGET과 기본값이 같다.)
    SGA_TARGET을 늘리고 싶다면 SGA_MAX_SIZE를 데이터베이스 인스턴스 시작 전에 늘려야 한다.
  • 시간이 지남에 따라 인스턴스의 메모리 요구사항이 파악되면 다양한 SGA 구성요소의 크기는 어느정도 고정된다. 데이터베이스는 각 요소의 정확한 크기를 다시 계산하지 않기위해 __DB_CACHE_SIZE, __JAVA_POOL_SIZE, __LARGE_POOL_SIZE, __SHARED_POOL_SIZE를 통해서 크기를 기억한다.(normal,immediate 로 shutdown 시 데이터베이스는 초기화 파라미터 파일에 이값을 기록하고, startup 시 이값을 각영역의 디폴트 값으로 사용
  • 위 네가지 영역중 하나를 최소값으로 사용하기 원한다면 SGA_TARGET을 추가로 파라미터에 설정하여야 한다.

10) 자동 메모리 관리

  • 11gR1 이상
  • memory_target파라미터로 설정

sys@BWD> create pfile='/tmp/pfile' from spfile;
File created.
sys@BWD> !cat /tmp/pfile;
BWD.__db_cache_size=121634816
BWD.__java_pool_size=4194304
BWD.__large_pool_size=4194304
BWD.__shared_pool_size=100663296
BWD.__streams_pool_size=0
*._b_tree_bitmap_plans=FALSE
*._optim_peek_user_binds=FALSE
*._optimizer_join_sel_sanity_check=true
*._sort_elimination_cost_ratio=10
*._table_lookup_prefetch_size=0
*.audit_trail='DB_EXTENDED'
*.background_dump_dest='/oracle/BWD/saptrace/background'
*.bitmap_merge_area_size=3355443
*.compatible='10.2.0'
*.control_file_record_keep_time=30
*.control_files='/oracle/BWD/sapbackup/cntrlBWD.dbf'
*.core_dump_dest='/oracle/BWD/saptrace/background'
*.create_bitmap_area_size=3355443
*.db_16k_cache_size=16777216
*.db_block_checksum='FALSE'
*.db_block_size=8192
*.db_file_multiblock_read_count=32
*.db_files=254
*.db_name='BWD'
*.db_writer_processes=2
*.dml_locks=2500
*.event='604 trace name errorstack'
*.filesystemio_options='asynch'
*.hash_area_size=1048576
*.java_pool_size=4194304#50000000
*.large_pool_size=4194304
*.log_archive_dest='/oracle/BWD/oraarch/BWDarch'
*.log_archive_max_processes=1
*.log_buffer=1
*.log_checkpoint_interval=0
*.log_checkpoint_timeout=0
*.log_checkpoints_to_alert=true
*.max_dump_file_size='20000'
*.O7_DICTIONARY_ACCESSIBILITY=true
*.open_cursors=800
*.optimizer_mode='choose'
*.os_authent_prefix='ops$'
*.parallel_execution_message_size=16384
*.parallel_max_servers=40
*.parallel_threads_per_cpu=1
*.pga_aggregate_target=256m                  <==
*.processes=300
*.query_rewrite_enabled='FALSE'
*.remote_os_authent=true
*.replication_dependency_tracking=false
*.sessions=600
*.sga_target=268435456                       <==
*.shared_pool_size=83886080
*.sort_area_retained_size=0
*.sort_area_size=1048576
*.star_transformation_enabled='true'
*.timed_statistics=true
*.transactions_per_rollback_segment=20
*.undo_management='auto'
*.undo_retention=150000
*.undo_tablespace='PSAPUNDO'
*.user_dump_dest='/oracle/BWD/saptrace/usertrace'
*.workarea_size_policy='AUTO'