다중 Block SIZE

사용시 유의사항

블록 크기에 따른 비교 분석

시나리오 

 
기본적으로 Oracle 에서 사용하는 Block 크기는 8k 이다. 오라클에서는 block 단위로 I/O 발생하게 된다. 하지만 이 기본 사이즈 말고 다른 사이즈의 Block 를 사용하고 싶다면 추가적으로 사용할 크기의 Cache 영역을 확보해야 한다. 즉 아래와 같은 순서로 작업이 진행 되어야 한다.


1. 시스템 파라미터 설정
2. 테이블 스페이스 생성시 BLOCKSIZE 키워드 사용으로 지정


사용시 유의사항

임시 테이블스페이스(Temporary Tablespace)에는 무조건 기본 블록 사이즈를 사용해야 한다.
분할 객체의 경우 모든 분할 영역은 동일한 블록 크기를 가지는 테이블 스페이스에 존재해야 한다.  
 



블록 크기에 따른 비교 분석 

블록의 크기가 큰 경우

블록의 크기가 크다면 한번의 I/O 작업으로 많은 데이터를 읽어 올 수 있다. 이것은 상황에 따라 단점 또는 장점이 된다.
(보통 8k 라면  2 byte 한글  4000글자 정도의 데이터를 포함 할 수 있다. )
장점
Data Buffer Cache 에서 hit 이 일어날 확률이 높아 진다.
- 하나의 블록에 많은 양의 데이터가 포함되어 있으므로 확률이 높아질 수 밖에 없다.

단점 
블록에 대한 경합 발생 확률이 증가난다. 
- 동시 트렌젝션이 많이 발생하는 테이블일 경우 MAXTRANS 를 초과하거나 블록 내의 여유공간이 부족한 경우 ITL 슬롯의 할당이 불가능 할 경우 allocate ITL entry 이벤트를 대기하게 된다. (참고 Database Block :  http://tawool-oracle.tistory.com/193 )


블록의 크기가 작은 경우

블록의 크기가 큰 경우와 비교해서 보면 이해가 빠르다. 

장점
블록에 대한 경합 발생 확률이 감소한다.

단점
Data Buffer 에서 Cache hit 이 발생할 확률이 감소한다.


분석 결과
일반적으로 위의 장/단점은 상황에 따라서 바뀔 수 있다. 기본 사이즈인 8k 이면 대부분의 상황에 만족한다. 하지만 블록 크기가 큰 편이 어느정도 유리하다. 물리적으로 발생하는 I/O보다 메모리상의 작업이 빠르기 때문이다.
단, 상황에 따라 다르므로 절대적이지 않다는 점에 유의하자.



시나리오

DB_CACHE에 16k Block size 에 대해 15MB의 영역을 설정하고, Block Size가 16k 인 Tablespace 를 생성하고자 한다. 


현재 시스템 파라미터 설정 조회

아래의 조회결과는 기본 Block size 말고 사용하는 Block size가 없다. 
-
SQL> show parameter cache_size
-- 결과
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size                    big integer 0
db_2k_cache_size                     big integer 0
db_32k_cache_size                    big integer 0
db_4k_cache_size                     big integer 0
db_8k_cache_size                     big integer 0
db_cache_size                        big integer 0
db_keep_cache_size                   big integer 0
db_recycle_cache_size                big integer 0
-


16k Block size 에 대해 15MB의 영역을 설정 

1MB 는 1048576 byte 이므로  1048576  * 15 을 하면 15728640 이다. 이 값을 설정하면 된다.

-
SQL> alter system set db_16k_cache_size=15728640 ;

System altered.

SQL> show parameter cache_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size                    big integer 16M
db_2k_cache_size                     big integer 0
db_32k_cache_size                    big integer 0
db_4k_cache_size                     big integer 0
db_8k_cache_size                     big integer 0
db_cache_size                        big integer 0
db_keep_cache_size                   big integer 0
db_recycle_cache_size                big integer 0
-

그런데 가만 보면 16MB 으로 설정된다. 이유는 오라클의 메모리 할당 단위인 그래뉼이라는 개념 때문에 이처럼 할당된다. 그래뉼은 SGA_MAX_SIZE 에 따라 단위가 달라진다. (현재 버전은 10g 이고  총 SGA_MAX_SIZE 가 400MB 으로 설정되어 있어서 4MB 이다.)


테이블 스페이스 생성

-
CREATE TABLESPACE tbs_16k
DATAFILE '/home/oracle/oradata/testdb/16k_tbs.dbf' SIZE 10M
BLOCKSIZE 16k
-

테이블스페이스 Block Size 조회

-
SQL> select TABLESPACE_NAME, BLOCK_SIZE from dba_tablespaces;
-- 결과
TABLESPACE_NAME                BLOCK_SIZE
------------------------------ ----------
SYSTEM                               8192
UNDOTBS1                             8192
SYSAUX                               8192
USERS                                8192
EXAMPLE                              8192
TEMP2                                8192
TEST01                               8192
TBS_16K                             16384
-





&
 

'Oracle > Architecture' 카테고리의 다른 글

선 로그 기법  (0) 2012.05.15
Large Pool  (0) 2012.04.13
SORT와 PGA_AGGREGATE_TARGET  (2) 2012.04.10
[Storage - 3] Segment  (0) 2012.01.27
[Storage - 2] Extent  (0) 2012.01.27