반응형

               < 오라클 저장구조 >



1. Oracle Block

Oracle Block 은 OS Block 을 한 개 이상 합쳐서 생성하며 DB_BLOCK_SIZE 로 지정

Oracle Block 의 크기가 8KB이고 OS Block 이 2KB 이면 OS Block 4개가 합쳐져야 1개의 Oracle Block


OS 블록과 Oracle 블록을 1:1 비율로 생성하면 Block Split 현상이 생기지 않음


DB_BLOCK_SIZE 파라미터는 Create database 할때 한 번 지정이 되면 db를 재생성하기 전에 변경이 안되며

이 파라미터에서 지정되는 크기 값을 standard block size 라고 한다


Block 의 크기는 2KB , 4KB , 8KB , 16KB , 32KB 가 제공 ( 간혹 64KB 지원하는 OS도 있음 )


5개의 Block 중에서 DB_BLOCK_SIZE 값에 설정된 크기를 Standard Block Size 라고 하고 

나머지를 Non-standard Block Size 라고 한다.


이렇게 다양한 블록 사이즈는 Tablespace 를 생성할 때 다르게 지정해서 사용 할 수 있다.

단 Standard block size 외의 테이블 스페이스를 생성할 경우 DB Buffer Cache 에도 해당 Block 사이즈 만큼의 공간을 

미리 할당해 두어야 에러가 발생하지 않는다.


SQL> create tablespace test_4k

   2    datafile '/app/oracle/oradata/testdb/test01.dbf' size 5m

   3    blocksize 4k ;


create tablespace test_4k

*

ERROR at line 1 :

ORA-29339 : tablespace block size 4096 does not match configured block sizes       <- 에러발생


SQL> alter system set db_4k_chache_size=10M ;         <- DB Cache 에 미리 공간 할당


System altered


SQL> create te tablespace test_4k

   2    datafile '/app/oracle/oradata/testdb/test01.dbf' size 5m

   3    blocksize 4k ;


Tablespace created      <- 에러없이 생성

2. PCTFREE & PCTUSED

PCTFREE : Block 에 입력되어 있는 데이터들이 Update 될 경우를 대비해서 비워두는 공간

이 값은 % 로 지정하며 8KB 의 블록을 PCTFREE=20 으로 지정할 경우 8KB의 20% 만큼 Update만을 위해 비워둠


PCTUSED : PCTFREE 를 뺀 공간이 Dirty block이 되었을때 특정량이 지워질 때 까지 Free block이 되지 않는다.

    여기서 얼마만큼의 양이 지워 져야 Free block이 되는가를 결정하는 파라미터가 PCTUSED




- 위 그림과 같이 PCTFREE=20 을 주면 8K 의 20% 는 업데이트를 위해 비워두는 공간

- 남은 80% 중에서 블록이 가득 차면 Dirty block 이 되는데 PCTUSED를 20% 지정해 주면 블록에서 사용하고 있는 양이 20%가 되기 전까지는 Dirty block 으로 남아 있다가 20%가 되면 Free block로 바뀌게 된다.


위 방식은 Tablespace 가 ASSM 방식 인지 MSSM 방식인지에 따라 역할이 달라짐 

- ASSM ( Automatic Segment Space Management ) : PCTUSED 파라미터 사용 안됨

- MSSM ( Manual Segment Space Management ) : Freelist 를 사용하기 때문에 FLM 이라고도 하며 테이블 생성시 두가지 파라미터 모두 사용


3. Row  Migration & Row Chaining

Row Migration : Row 의 update 가 발생했을 경우 해당 block 에 빈 공간이 부족해서 다른 block 으로 이사를 가는 경우

- row migration 을 줄이려면 PCTFREE 값을 많이 주거나 테이블을 재생성 하는 작업을 해서 경우를 줄여야함


Row Chaining : 데이터가 너무 길어서 하나의 블록에 모두 기록할 수 없는 경우 다른 블록과 연결해서 데이터를 저장하는 경우

- block 의 크기보다 큰 데이터가 들어와서 생기는 경우가 많으므로 block의 크기를 크게 생성하는것이 좋다.


주의점

- row migration 을 줄이기 위해 PCTFREE 값을 많이주게되면 update 가 없을 경우 공간낭비가 심해지므로 주의

- row chaining 을 줄이기 위해 block 을 크게 주면 wait 현상이 많이 발생해서 성능이 저하될수 있음


4. Extent & Segment

연속적으로 있는 Block 을 여러개 묶어 놓은 단위를 Extent 라고 한다

이러한 Extent 를 여러개 모여서 Segment 가 구성됨


사용자가 테이블 생성시 데이터가 없더라도 기본값을 가지고 데이터파일에 연속적인 block 을 묶어서 extent를 생성

그리고 데이터가 계속 추가되어 최초 값을 다 사용하게 되면 extent를 추가로 생성하게 됨


실습.


SQL> create tablespace test_extent

   2    datafile '/app/oracle/oradata/testdb/ex_test01.dbf' size 5M ;


SQL> create table ex_table01

   2    ( no number , name varchar2(10)) tablespace test_extent ;


SQL> col tablespace_name for a15

SQL> select tablespace_name , extent_id , blocks , bytes

   2    from user_extents

   3    where segment_name='EX_TABLE01' ;


TABLESPACE_NAME        EXTENT_ID        BLOCKS        BYTES

----------------        ---------        -------        ------

TEST_EXTENT                        0                    8                65536


ex_table01 테이블을 생성하면서 자동적으로 64KB Extent 1개가 할당 되었고 이 Extent는 8kb block 8개 모아서 생성

이렇게 초기 할당된 extent 를 모두 다 쓰게 되면 다시 재 할당을 받게 됨














반응형

'오라클 > 관리 실무' 카테고리의 다른 글

DBMS_JOB & DBMS_SCHEDULER  (0) 2014.10.27
사용자 관리  (0) 2014.10.27
Tablespace 와 Data File 관리하기  (2) 2014.10.21
Redo Log 관리하기  (0) 2014.10.20
Control File 관리하기  (0) 2014.10.20
ORACLE 시작하기 & 종료하기  (0) 2014.10.20
Oracle Background Process  (0) 2014.10.17

+ Recent posts