5. 캐시와 복사

데이터 블록을 메모리에 적재하고, 검색하고, 변경된 다수의 복제본 처리방법
키워드 : 그래뉼, 버퍼 풀, 버퍼 캐시, working data set

그래뉼

  • ASMM은 SGA 크기 내에서, 최적화를 위해 db_cache_size 와 shared_pool_size 크기를 자동 조절 (I/O 감소, 파싱 시간 감소 등)
  • 이때 효율적인 메모리 이동을 위해서 고정된 크기의 그래뉼(Granule) 사용 (OS, DB버전, SGA크기에 따라 그래뉼 크기가 다름 => 4MB, 8MB, 16MB, 64MB...)

인스턴스 그래뉼 크기 확인


SQL> select * from v$sgainfo where name = 'Granule Size';

NAME                                  BYTES RES
-------------------------------- ---------- ---
Granule Size                       16777216 No

컴포넌트 별 그래뉼 정보


SQL> select component, current_size, granule_size, round(current_size/granule_size) from v$sga_dynamic_components;

COMPONENT                                                        CURRENT_SIZE GRANULE_SIZE ROUND(CURRENT_SIZE/GRANULE_SIZE)
---------------------------------------------------------------- ------------ ------------ --------------------------------
shared pool                                                         838860800     16777216                               50
large pool                                                          100663296     16777216                                6
java pool                                                           100663296     16777216                                6
streams pool                                                         83886080     16777216                                5
DEFAULT buffer cache                                               4647288832     16777216                              277
KEEP buffer cache                                                           0     16777216                                0
RECYCLE buffer cache                                                        0     16777216                                0
DEFAULT 2K buffer cache                                                     0     16777216                                0
DEFAULT 4K buffer cache                                                     0     16777216                                0
DEFAULT 8K buffer cache                                                     0     16777216                                0
DEFAULT 16K buffer cache                                                    0     16777216                                0
DEFAULT 32K buffer cache                                                    0     16777216                                0
Shared IO Pool                                                      536870912     16777216                               32
ASM Buffer Cache                                                            0     16777216                                0

모든 그래뉼 목록


SQL> select ge.grantype, ct.component,
       ge.granprev, ge.grannum, ge.grannext
  from x$ksmge ge,
       x$kmgsct ct
 where ge.grantype != 6
   and ct.grantype = ge.grantype
 order by ge.grantype, ct.component;14:31:59   2  14:31:59   3  14:31:59   4  14:31:59   5  14:31:59   6  14:31:59   7  

  GRANTYPE COMPONENT                                                          GRANPREV    GRANNUM   GRANNEXT
---------- ---------------------------------------------------------------- ---------- ---------- ----------
         1 shared pool                                                             174        508        507
         1 shared pool                                                             508        507        506
         1 shared pool                                                             507        506        505
...
         1 shared pool                                                             177        176        175
         1 shared pool                                                             176        175        174
         1 shared pool                                                             175        174        508
	 2 large pool                                                                0        464        463
...
	 2 large pool                                                              460        459          0
         3 java pool                                                                 0        458        457
...
	 3 java pool                                                               454        453          0
         4 streams pool                                                            136        137          0
...
	 4 streams pool                                                              0        133        134
         7 DEFAULT buffer cache                                                    451        452        437
...
         7 DEFAULT buffer cache                                                    151        142        447
        15 Shared IO Pool                                                            0        173        170
...
        15 Shared IO Pool                                                          139        138        140

376 rows selected.

  • 오라클 버전 별 메모리 변경 기능
버전기능파라미터비고
9i수동-
10gASMM(Automatic Shared Memory Management)sga_target
11gAMM(Automatic Memory Management)memory_targetSGA, PGA(pga_aggregate_target) 관리

그래뉼과 버퍼

데이터 캐시 관련 그래뉼 용도

1. 버퍼 배열용 (대세)
2. 버퍼 헤더 배열용 (x$bh)
3. 관리용

그래뉼

  • x$bh 에는 많은 포인터 존재 하며 레코드 길이는 150B ~ 250B 가 될 수 있음
  • 버퍼 배열의 각 로우는 버퍼 헤더 배열의 로우와 1:1 연결됨, 버퍼 헤더는 블록 정보, 버퍼 상태, 다른 버퍼 헤더 포인터 정보 있음
  • 아래 두 환경 모두 버퍼 캐시 48MB, 그래뉼 8MB(6개), 하지만 버퍼 수는 다르다 (그레뉼헤더, 버퍼헤더 크기가 다르기 때문)

버전 별 버퍼수 차이


-- 32bit 9.2.0.8 (x$bh 레코드 길이 186 bytes)
SQL> select current_size, granule_size, round(current_size/granule_size) from v$sga_dynamic_components where component = 'DEFAULT buffer cache';

CURRENT_SIZE GRANULE_SIZE ROUND(CURRENT_SIZE/GRANULE_SIZE)
------------ ------------ --------------------------------
    50331648      8388608                                6

SQL> select block_size, buffers from v$buffer_pool;

BLOCK_SIZE BUFFERS
---------- -------
      8192    6006 <-- 그래뉼 한개당 1001개 버퍼 ( 그래뉼[8388608] = 버퍼[8192*1001] + 버퍼헤더[186*1001] + 그래뉼헤더[2230]

-- 32bit 11.1.0.7 (x$bh 레코드 길이 208 bytes)
SQL> select current_size, granule_size, round(current_size/granule_size) from v$sga_dynamic_components where component = 'DEFAULT buffer cache';

CURRENT_SIZE GRANULE_SIZE ROUND(CURRENT_SIZE/GRANULE_SIZE)
------------ ------------ --------------------------------
    50331648      8388608                                6

SQL> select block_size, buffers from v$buffer_pool;

BLOCK_SIZE BUFFERS
---------- -------
      8192    5982 <-- 그래뉼 한개당 997개 버퍼 ( 그래뉼[8388608] = 버퍼[8192*997] + 버퍼헤더[208*997] + 그래뉼헤더[13808]

참조 문서

이 자료는 (오라클 코어)를 참고 하여 작성했습니다.