[DB] Oracle - INDEX 에서의 PCTFREE와 PCTUSED

|
오라클 인덱스에서의 PCTFREE와 PCTUSED에 대해서 알아보도록 하겠다.

테이블 생성시 사용자가 정할 수 있는  PCTFREE와 PCTUSED에 대해서 먼저 알아보고 이러한 내용이 인덱스에 어떻게 적용되는지 살펴보겠다.

* PCTFREE

PCTFREE란 해당 블록에 실제 데이터가 들어갈 때 설정해 준 PCTFREE만큼을 제외하고 데이터를 채우도록 하는 값을 의미한다.

예를들어 PCTFREE를 20%로 설정한다고 하면 80%만큼만 데이터를 채우고 다음 블록에 나머지 데이터들을 채우는 것이다.

이렇게 PCTFREE를 설정하는 이유는 향후 데이터의 CRUD가 일어날 시 기존에 존재하던 블록에 데이터가 들어와야 할 경우가 있기 때문이다.

* PCTUSED

PCTUSED는 블록의 재활용을 위한 설정값이다. 예를 들어 PCTUSED를 50%로 설정할 경우 블록에 존재하던 데이터의 양이

50% 이하로 내려갈 경우에만 이 블록에 다른 데이터를 채울 수 있도록 하는 것이다. 


아주 심플하게 나열해본 PCTFREE와 PCTUSED이다. 그렇다면 테이블의 한 종류라고 볼 수 있는 인덱스의 경우 위에 나열한 설정값을 어떻게

사용하는지 알아보도록 하겠다.

인덱스 생성시에는 PCTFREE를 사용한다. 이것은 B tree 인덱스에 관련한 글에서도 나타나있는 내용으로  저장영역의 여유공간이 없을시에는

인덱스 블록이 두개로 분할되어 생성된다. 그렇기에 적절한 PCTFREE를 사용할 경우 인덱스 블록이 분할되지 않고 갱신할 수 있겠다.

하지만 인덱스는 어차피 주기적으로 rebuild를 거쳐야 하기 때문에 PCTFREE를 어떻게 사용할지는 사용자에 따라서 다르다고 볼 수 있다.


PCTUSED의 경우 인덱스에서 따로 설정할 수 있는 값은 없다. 사용자가 따로 설정하는 값이 아닌 기본값으로 0이 맞춰져 있는 것이다.

이것이 의미하는 바는 블록에서 데이터가 삭제되더라도 다른 데이터의 삽입시 재활용되지 않는다는 것이다. 이 내용에 관련된

외국사이트의 토론/답변을 보고 이해를 할 수 있었다.

block 1
가위
나방
다람쥐

block2
바퀴
사이다
우유


위와 같은 인덱스가 존재한다고 가정해 보자. 


block 1의 데이터 중 나방, 다람쥐를 삭제했을시 블록에는 다음과 같은 데이터만이 남을 것이다.

block 1
가위

block2
바퀴
사이다
우유



그리고 새로이 '해일' 이라는 데이터값을 삽입하려고 했을 시에는 일반적인 생각과는 달리  block 1의 비어있는 공간에

데이터가 들어가는 것이 아니라는 것이다.

block 1
가위

block2
바퀴
사이다
우유

block 3
해일


새로이 들어간 해일 데이터는 이렇게 새로운 블록을 생성하고 저장되게 된다. 


여기서 이렇게 새로운 블록이 생성된 이유는 block1이 인덱스로서 생성될 시 해당 노드의 Branch(상위) 노드에는 가~다 와 같은 형태로

저장될 수 있는 데이터의 범위가 지정되었기 때문이다. 현재 '가위'라는 데이터만 남아있고 2개의 공간이 비어있지만 이 블록의 범위에

'해일' 이라는 값이 해당되지 않기 때문에 저장되지 않는 것이다. 



그렇다면 rebuild를 주기적으로 해야하는 인덱스지만 과연 재활용은 되지 않는 것일까.

이 문제에 대한 답변도 함께 달려있었다. 위의 예시와 같은 경우에는 재활용이 절대 되지 않는다. 하지만 만약 '가위'라는 데이터마저

block1에서 삭제할 경우는 어떻게 될까. 이렇게 해당 블록의 데이터가 완벽하게 지워진 경우는 범위의 제한없이 어떠한 데이터건 

받아들일 수 있게된다. 

block 1
자전거
파도
해일

block2
바퀴
사이다
우유


분명 물리적인 데이터 블록의 위치는 block1이 block2보다 앞에 위치할 것이다. 하지만 Branch 블록에 저장된 범위는 block2가 우선, 

그리고 block1이 뒤에 위치한다.

이렇게 PCTUSED가 0인 이유와 해당 블록의 데이터가 완전히 삭제된 경우에는 인덱스가 재활용 될 수 있다는 것을 알아보았다.

아주 유익한 내용이지만 직접 검증을 해 본 내용이 아니기 때문에 확신할 수는 없다. 향후 이 내용에 대해서 직접 테스트 해본 뒤에야

확신 할 수 있을것 같다.

* 출처 : http://forums.oracle.com/forums/thread.jspa?messageID=2188299&tstart=0 

'DB' 카테고리의 다른 글

[DB] MySQL - DDL TRUNCATE과 DELETE  (0) 2011.06.09
[DB] MySQL - 권한 할당 및 해제[GRANT/REVOKE]  (0) 2011.06.07
[DB] Oracle - Bitmap INDEX  (0) 2011.04.24
[DB] Oracle - B tree INDEX  (1) 2011.04.21
[DB] MySQL - mysqldump 명령어  (0) 2011.02.15
And