사용되지 않은 공간을 DEALLOCATE
TABLE, INDEX, CLUSTER등의 DATABASE OBJECT들은 입력되는 자료의 양이 증가함에 따라서 새로운 EXTENT들이 자동적으로 할당된다.
이때 필요이상 과도한 크기의 EXTENT가 할당되면 실제로 자료가 들어있지 않거나 들어갈 예정이 없는 죽은 공간이 생길 수 있게 된다. 이러한 죽은 공간은 DISK전체의 사용효율을 저하시키는 원인이 되므로 적절히 제거되어야 하는데 여기서는 그중에서 DEALLOCATE라는 방법에 대해서 알아 본다.
1. DEALLOCATE의 대상
TABLE, INDEX, CLUSTER들이 생성된 이후에 한번도 사용되어지지 않은 공간. ORACLE에서는 이렇게 한번도 사용되지 않은 공간을 HIGH WATER MARK라는 개념으로 설명하는데 이는 다음과 같다.
TABLE_A 의 EXTENT구조
EXTENT1
|------------------
EXTENT2
|----------------A-------------
EXTENT3
|-----------B---------------|
A.현재 DATA가 차있는 위치 B.HIGH WATER MARK
TABLE이 생성된 이후 DATA가 INSERT되어 B지점까지 공간을 점유하고 있었다고 가정을 하자. 이후 DATA가 DELETE되어 현재 DATA들이 점유하고 있는 위치는 A라고 하면 B지점이 HIGH WATER MARK가 된다.
DEALLOCATE작업을 하면 HIGH WATER MARK위의 공간만이 FREE되며, HIGH WATER MARK아래의 공간들 (B-A)은 이후 DATA가 다시 INSERT될 것을 예상하여 그대로 빈공간으로 남겨두게 된다.
2. DEALLOCATE의 대상이 되는 공간이 어느정도 존재하는지 파악하는 방법
ANALYZE TABLE table_name COMPUTE STATISTICS ;
예 1)
SELECT EMPTY_BLOCKS, BLOCKS
FROM DBA_TABLES
WHERE TABLE_NAME = 'table_name' ; EMPTY_BLOCKS
------------
BLOCKS
--------
6530
2400
EMPTY_BLOCKS : OBJECT에 할당된 총 SPACE중 HIGH WATER MARK 위의 공간
BLOCKS : OBJECT에 할당된 총 SPACE중 HIGH WATER MARK 아래의 공간
여기서 EMPTY_BLOCKS + BLOCKS(해당 OBJECT의 총 SPACE)에 비해서 EMPTY_BLOCKS 이 과도하게 크고 앞으로 더이상의 DATA INSERT도 일어나지 않을 계획이라면 DEALLOCATE를 하는 것이 좋다.
3. SYNTAX
ALTER TABLE table_name DEALLOCATE UNUSED [KEEP integerK] ; ALTER INDEX index_name DEALLOCATE UNUSED [KEEP integerK] ; ALTER CLUSTER cluster_name DEALLOCATE UNUSED [KEEP integerK] ;
KEEP절을 사용하면 KEEP절에 정의된 크기만큼은 남겨두고 DEALLOCATE를 한다.
예 2)
위의 예 1)에서
ALTER TABLE table_name DEALLOCATE UNUSED ;
를 수행하면 다음과 같이 SPACE
ANALYZE TABLE table_name COMPUTE STATISTICS ;
SELECT EMPTY_BLOCKS, BLOCKS
FROM DBA_TABLES
WHERE TABLE_NAME = 'table_name' ;
EMPTY_BLOCKS
------------
BLOCKS
-------
0
2400
위의 조회 결과를 보면 HIGH WATER MARK위 부분(EMPTY_BLOCKS)은 FREE되어 0으로 표시되고 HIGH WATER MARK아래부분(BLOCKS)은 그대로(2400) 남아있다.
|