[Oracle DB] Oracle 저장구조 정리(블럭, PCTFREE, PCTUSED)

| 오라클 블럭(Oracle Block)


회사에서 쓰는 레거시 DDL문을 분석해 보니 PCTFREE, PCTUSED가 나와서 이를 정리한 포스팅입니다. 무려 9i이후부터 세그먼트를 자동적으로 관리하는 ASSM(Automatic Segment Space Management)가 나와 SEGMENT SPACE MANAGEMENT AUTO 절을 넣어 자동으로 관리하고 있습니다. 이렇게 수동으로 관리하는 것을 보기 어렵게 되었다고 알고있는데 어쩌겠습니까? 월급쟁이의 설움 ㅠㅠ 돈 받고 일하려면 어쩔 수 없이 해야죠. (회사를 까는 거는 아닙니다 ㅎㅎ;)


오라클에서의 I/O는 블럭단위로 이루어집니다. 오라클 블럭은 OS의 블럭 한 개 이상을 합쳐 만들며 DB_BLOCK_SIZE로 지정하게 됩니다(기본 오라클 DB 블럭 사이즈). 예를 들어, 오라클 블럭의 크기가 8KB이고 OS 블럭 크기가 2KB이면 OS 블럭 4개가 오라클 블럭 하나를 이루는 개념입니다.

현재 쓰시는 오라클의 블럭 크기는 아래의 명령어를 통해 확인할 수 있습니다.


show parameter db_block_size


이 DB_BLOCK_SIZE 파라미터는 데이터베이스를 생성할 때 지정되며 재생성하기 전까지는 변경되지 않습니다. 이 파라미터에서 지정되는 크기 값을 표준 블럭 사이즈(standard block size)라고 하고 DB_BLOCK_SIZE로 표시되는 값입니다. (Block의 크기는 2KB, 4KB, 8KB, 16KB, 32KB, 64KB가 제공)


또한 표준 블럭사이즈가 아닌 다양한 크기의 블럭 사이즈를 테이블을 만들 때 지정할 수 있습니다. 이때 블럭사이즈를 다르게 하여 테이블을 생성할 경우 DB Buffer Cache에도 블럭사이즈 만큼의 공간을 미리 할당해야 합니다.


| PCTFREE와 PCTUSED란 


PCTFREE는 블럭에 입력되어 있는 데이터들이 업데이트될 경우를 대비해서 미리 비워두는 공간입니다. 즉 사용가능한 Block 공간 중에서 데이터의 Update 등 데이터 변경을 대비해서 확보해 놓은 블럭의 비율이며 이 값은 % 수치로 지정됩니다. 만일 PCTFREE=20으로 되있으면 8KB 블럭의 20%만큼을 업데이트를 위해 비워두게 됩니다. 기본값(Default)은 10%입니다. 


PCTUFREE 비율을 적게할 경우

- 기존 테이블 행 업데이트에 의한 확장을 위해 적은 공간을 확보

- 많은 데이터를 한 블럭에 입력 가능


PCTFREE가 클 경우

- 블럭당 적은 데이터가 입력되므로 같은 데이터를 입력하기 위해 많은 블럭이 소요됨(디스크에 차지하는 용량이 커짐)

- 데이터를 업데이트할 때 수행 속도가 증가함. 따라서 업데이트가 자주 일어나는 세그먼트에 적합


PTCUSED는 오라클 서버가 테이블의 각 데이터 블럭에 대해 유지하려는 공간의 최소 백분율입니다. 블럭의 남아 있는 공간(free space)가 PCTFREE의 수치에 도달한 후, 사용된 공간이 PCTUSED 이하의 값이 되기 전까지는 해당 블럭에 새로운 데이터를 추가할 수 없는 것입니다. PCTFREE에 도달하기 전까지는 새로운 행을 Insert하지 못하고 기존 데이터를 Update만 할 수 있습니다.



그림을 예로들어 보면 PCTFREE의 값이 위의 그림과 같이 기본값 10%로 되어 있으면 90%까지 블럭의 데이터가 채워진다는 것입니다. 그리고 이만큼 다 채워지면 PCTUSED 비율인 40%까지 데이터가 비어지지 않으면 이 블럭에는 데이터가 채워지지 않는다는 의미입니다.


| 특정 테이블의 PCTFREE, PCTUSED값 확인하기


select table_name, pct_free, pct_used
from dba_tables
where owner='TEST'
and table_name = 'PCT_TEST'


| PCTFREE 및 PCTUSED 값을 선택하는 예


1. Insert, Delete가 자주 발생하지만 Update시 ROW의 크기가 증가 되지 않을 때
  • - PCTFREE = 5
  • - PCTUSED = 60
2. UPDATE시 ROW의 크기가 증가 될 때
  • - PCTFREE = 20
  • - PCTUSED = 40
3. 테이블이 매우 크지만 대부분 Read Only Transaction 일 때
  • - PCTFREE = 5
  • - PCTUSED = 90


참고자료  

https://goalker.tistory.com/97

https://o2sunn.tistory.com/22

http://www.gurubee.net/lecture/1103

https://slidesplayer.org/slide/11065092/

  

이 글을 공유하기

댓글(2)

  • dba
    2020.04.14 21:14

    안녕하세요
    질문하나 남깁니다.
    buffer cache에서 multiple buffer pool 사용시 default 공간은 영향을 받지 않고 대신 buffer cache size를 multiple buffer pool에 할당 할 만큼 늘려 줘야하는 것으로 알고있습니다.
    하지만 현재 메모리는 11g이후 AMM으로 자동으로 관리되는 것으로 알고있는데 그럼 이 상황에서도
    default pool은 자신이 할당만은 공간에 영향을 받지않고 알아서 Buffer Cache의 영역을 늘려주나요?

    • 2020.04.15 09:47 신고

      AMM이 default pool을 어떻게 관리하는 지는 정확하게는 잘 모르지만 11g 이후에 AMM에서는 memory cache를 수동적으로 관리할 필요가 없다고 오라클 문서에 언급되어 있습니다.

      아래는 그것을 설명하는 링크입니다.

      https://docs.oracle.com/database/121/TGDBA/tune_buffer_cache.htm#TGDBA294

Designed by JB FACTORY