본문 바로가기

공부 이야기/데이터베이스

[Oracle] HWM(High Water Mark), PCT, freelist

데이터베이스는 테이블 스페이스, 세그먼트, 익스턴트, 블록 순으로 각각 1대N의 관계로 세분화된다. 

단편화를 줄이기 위한 방식으로 사료된다.

세그먼트는 테이블 스페이스 내에 여기저기 산재될 수 있는 반면 익스턴트는 연속된 블록으로 이뤄져 있다.

관련성 있는 데이터끼리 군집화시켜놓는 것이 조회 효율성을 높여주기 때문이다.

 

이 중 가장 작은 단위는 '데이터 블록'으로 실제 I/O가 발생할 때 읽고 쓰는 단위이다.

단 1Byte 데이터를 읽으려고 해도 데이터 블록인 2KB를 읽는다.

데이터 블록을 제외한 나머지는 유동적인 크기를 가진다.

 

세그먼트는 공간을 확장할 때 익스턴트 단위로 하나씩 늘린다. 

이 때 사용되는 개념이 High Water Mark이다.

오라클은 일종의 선을 먼저 지정한 후, 공간을 늘리는 방식을 사용한다.

Insert, Update, Delete와 같은 DML 연산이 수행될 때마다 조금씩 그 선이 늘거나 줄어든다.

그리고 세그먼트에 대해 full scan을 할 경우 HWM까지 읽는다.

세그먼트는 크기가 데이터 블록처럼 고정적이지 않기 때문에 선을 정해놓고 읽을 필요가 있기 때문이다.

 

하지만 만약에 HWM 이하의 데이터가 몽땅 사라져도 HWM 선을 재지정해주지 않으면 그만큼의 공간이 놀게 된다. (내부 단편화)

Truncate는 Drop과 다르게 데이터 삭제 수행시 HWM 선을 재지정해주고 노는 메모리를 반환해준다. 뒤가 깔끔한 친구

 

데이터 블록도 뭔가 복잡한 것이 있다.

 

PCTFREE라는 불가침 영역이 있다.

그림에서는 20%로 지정했는데 저 위로는 데이터를 더 추가할 수가 없다.

참고로 비어 있는 공간을 freelist 라고 한다. freelist로부터 메모리를 할당받아서 데이터를 추가하는 방식이다.

 

더 웃긴건 PCTUSED 영역이다.

 

Delete 연산이 몇 번 수행되서 데이터를 freelist 영역에 반환해도 40% 이하로 떨어지지 않으면 새로 insert를 할 수가 없다.

왜 이렇게 까다롭게 구는걸까? 

 

먼저 PCTFree를 만든 이유는 다음과 같다.

순간적으로 데이터가 추가될 때 여유 공간이 부족해서 다른 데이터 블록을 사용하게 되는 현상을 미리 방지하기 위해 적당한 여유를 두는 것이다. 운전할 때 앞 차와의 거리를 두는 것처럼 말이다.

빡빡하게 공간을 할당하면 테이블 구조를 변경하거나(물리적) 인덱스 조회시 성능 저하를 유발할 수 있다.

 

하지만 그럼에도 추가할 데이터의 행이 너무 크면? 칼럼이 한 30개 되거나 long 타입 같은 경우 이에 해당할 수 있다.

"별 수 없다."

새로운 블록 공간을 할당하고 연결한다. 이를 data chain이라고 한다.

기존 블록에 덧붙여서 추가하는 방법이 아닌 아예 새로운 블록 공간부터 전체 행을 복사해서 할당하는 방법도 있다.

이는 data migration이라고 한다.

 

하지만 불행히도, 두가지 행위는 Oracle이 가지는 row based database의 한계이고 튜닝 작업 대상 중 하나이다.

추가적인 Disk I/O 작업을 유발시키기 때문이다.

V$SYSSTAT에서 "table fetch continue row" 통계로 마이그레이션되거나 연결된 행을 확인할 수 있다.

추가 테이블을 새롭게 만들거나 파라미터 값을 재조정해서 PCTfree 영역을 줄이는 방법을 선택할 수 있다.

select table_name, pct_free, pct_used
  from dba_tables
 where owner = 'TEST001'
   and table_name = 'PCT_TEST'
;
update dba_tables
   set pct_free = 40
 where owner = 'TEST001'
   and table_name = 'PCT_TEST'
;

 

 

PCTUSED 40% 제한은 다음과 같다.

블록에 있는 데이터를 삭제하고 다시 해당 공간에 insert를 하게 되면 성격이 다른 데이터가 섞일 수 있다.

옷장에 공간이 빈다고 스웨터, 후드티, 바지, 여름옷, 겨울옷 구분 없이 쑤셔넣으면 나중에 찾거나 정리할 때 힘든 것처럼 말이다.

이를 유식하게 Clustering Factor가 떨어진다고 한다.

 

 

데이터베이스는 알면 알수록 신비한 세상이다. 

 

 

참고자료 : https://docs.oracle.com/cd/A58617_01/server.804/a58227/ch3.htm

 

Data Blocks, Extents, and Segments

Note: This discussion does not apply to LOB datatypes (BLOB, CLOB, NCLOB, and BFILE) - they do not use the PCTFREE storage parameter or free lists. See "LOB Datatypes" on page 10-9 for more information.  

docs.oracle.com