카테고리 없음

[오라클] 데이터 버퍼 캐시 실습으로 이해하기

Dong538 2021. 11. 27. 14:58

우선 SGA 구성 요소 중 하나인 데이터 버퍼 캐시의 필요성을 알아보도록 한다. 데이터 블록을 디스크에서 액세스하는 것과 메모리에서 액세스 하는 것은 성능 상 큰 차이가 있다. 자주 사용되는 데이터 블록의 메모리 저장 공간이 데이터 버퍼 캐시이다. 여기서도 LRU 알고리즘을 사용해서 Logical read가 발생할 수 있도록 한다. 데이터 블록 검색 시 해시 테이블 아키텍처를 사용해 검색 성능을 높였다. 

아래 결과에서 Database buffer = DEFAULT buffer cache + Shared IO Pool 으로 나온 것이 데이터 버퍼 캐시이다. 또 SGA에서 데이터 버퍼 캐시에 가장 많은 크기를 할당한 것을 확인할 수 있다. 

SQL> SELECT * FROM V$SGA_DYNAMIC_COMPONENTS;

COMPONENT                                                        CURRENT_SIZE   MIN_SIZE   MAX_SIZE USER_SPECIFIED_SIZE OPER_COUN
---------------------------------------------------------------- ------------ ---------- ---------- ------------------- ---------
shared pool                                                         218103808  218103808  218103808                   0
large pool                                                           16777216   16777216   16777216                   0
java pool                                                            16777216   16777216   16777216                   0
streams pool                                                                0          0          0                   0
unified pga pool                                                            0          0          0                   0
memoptimize buffer cache                                                    0          0          0                   0
DEFAULT buffer cache                                                419430400  419430400  419430400                   0
KEEP buffer cache                                                           0          0          0                   0
RECYCLE buffer cache                                                        0          0          0                   0
DEFAULT 2K buffer cache                                                     0          0          0                   0
DEFAULT 4K buffer cache                                                     0          0          0                   0

COMPONENT                                                        CURRENT_SIZE   MIN_SIZE   MAX_SIZE USER_SPECIFIED_SIZE OPER_COUN
---------------------------------------------------------------- ------------ ---------- ---------- ------------------- ---------
DEFAULT 8K buffer cache                                                     0          0          0                   0
DEFAULT 16K buffer cache                                                    0          0          0                   0
DEFAULT 32K buffer cache                                                    0          0          0                   0
Shared IO Pool                                                       33554432   33554432   33554432            33554432
Data Transfer Cache                                                         0          0          0                   0
In-Memory Area                                                              0          0          0                   0
In Memory RW Extension Area                                                 0          0          0                   0
In Memory RO Extension Area                                                 0          0          0                   0
ASM Buffer Cache                                                            0          0          0                   0

20 rows selected.

SQL> SHOW SGA

Total System Global Area 1207958960 bytes
Fixed Size                  8895920 bytes
Variable Size             738197504 bytes
Database Buffers          452984832 bytes
Redo Buffers                7880704 bytes

 

디스크에서 데이터 버퍼 캐시로 액세스하는 역할은 서버 프로세스가 담당하고, 수정된 데이터를 메모리 -> 디스크로 저장하는 역할은 DBWR 백그라운드 프로세스가 담당한다. 참고로 오라클의 IO 단위는 데이터 블록이다. 

 

서버 프로세스는 아래 파라미터에 지정된 데이터 블록 개수만큼 한 번에 읽어온다. 

SQL> SHOW PARAMETER DB_FILE_MULTIBLOCK_READ_COUNT

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count        integer     103

 

데이터 블록이 기본 IO단위라고 설명했는데, 데이터 블록 크기를 직접 지정할 수 있고 이 크기에 따라 각각 특징이 존재한다.

데이터 블록을 크게 설정할 경우, 메모리에서 데이터 블록 사용율이 높고, 한 번에 많은 데이터를 추출 가능하다는 장점이 있지만 데이터 블록에 대한 경합 발생 가능성 또한 높아진다.