본문 바로가기

ORACLE

PCT Free와 PCT Used

테이블을 create할때 주는 파라메터 중


pct free와 pct used라는 것이 있다.


pct free란?


오라클의 블록 크기를 4k로 잡았다고 가정하고 이 4k에 데이터가 100% 꽉 차있다고 하자.

이 레코드 중 update로 인해 데이터의 크기가 늘어나게 되면 (ex a->abc로 update)

4k 블록안에는 들어갈 자리가 없으므로 다른 4k짜리 블록을 새로 할당하여 레코드를 링크하게 되고

이를 블락 체인이라고 하며 이는 오라클 6일때까지 일어났던 현상이다. 하나의 레코드를 읽기 위해 여러 다른 블록을 access해야 하므로 속도가 많이 떨어지게 된다.

(데이터베이스 속도에 지대한 영향을 미치는 것은 I/O)


이를 향상하게 위해 나온 것이 로우 마이그레이션이다. (oracle 7 부터..) 쪼개질 데이터가 있으면

링크를 거는 것이 아니라 로우 전체를 블록을 옮겨 버리는 것이다.


여기서 pct free라고 하는 것은 pct free를 10%로 줬을 경우 4k중 400바이트를 남겨두게 되고

이는 내부적으로 위와 같은 update가 일어났을때 pctfree로 잡아놓은 400 바이트짜리 공간을

사용하게 되고 체이닝의 발생을 막는다.



pct used란?


pct free 10%로 잡아 놓은 상태에서 400바이트를 제외한 블록의 모든 공간을 사용하고 있을때

레코드를 하나 삭제했다고 하면 그 블록의 사용율이 90%에서 88%정도로 떨어졌다고 해보자.

그러면 새로운 레코드를  insert할때 사용율이 88%정도로 떨어진 이 블록에다가 데이터를 넣을까?


넣지 않는다.


이유는 스토리지 메니지먼트 알고리즘이 너무 바빠지기 때문이다. pct free의 경계선을 들락날락

하는 블록이 엄청나게 많을 수가 있는데 이때마다 이 블록들을 관리하기 위해서는 메니지먼트가

너무 빡세진다는 말씀 -_-


그래서 사용되는 것이 pct used 파라메터이다.


즉 블록의 사용량이 일정 수준까지 떨어지기 전까지 새로운 데이터가 들어오지 못 하게

하는 것인 pct used이다. pct used를 60으로 주면 쓰고있는 공간이 60%이하로 떨어지면

그때부터 새로운 데이터를 넣을 수 있게 프리 리스트에 등록을 해주겠다는 얘기이다.



참고:

테이블 create시에는 이 두개의 파라메터가 다 있으나 index create시에는 pct used가 없다.

이 말은.. 인덱스 블록일 경우 아무리 인덱스가 지워져서 그 사용량이 10%이하로 떨어져도

이를 프리 리스트에 등록하지 않고 그대로 인덱스 블록으로서 사용하지 않는 공간으로

남겨두겠다는 얘기임. 이래서 테이블의 크기보다 인덱스의 크기가 훨씬 큰 경우도 존재한다.


테이블의 크기가 2G일 경우 최초 생성한 인덱스의 크기가 2G라고 가정.

여기서 대규모로 데이터를 delete한 후 다시 insert를 하면 인덱스도 다시 만들어지는데

기존에 만들어졌던 2G의 인덱스 공간을 다시 활용하는 것이 아니고 , 새로운 인덱스 블록을 잡아서

다시 만들기 때문이다.


이래서 필요한게 alt index rebuild.... 한쪽으로 치우쳐져있는 인덱스의 B-tree를 다시 일정한

밸런스로 맞춰주는것..