본문 바로가기

전산Tip/Oracle

[ORACLE] EMPTY BLOCK 확인

반응형
ANALYZE TABLE DLSM_BR_CALL COMPUTE STATISTICS;

SELECT  EMPTY_BLOCKS, BLOCKS
FROM    DBA_TABLES
WHERE   TABLE_NAME = 'DLSM_BR_CALL'
;


--------------------------------------------------------------------------------------------------------------



제품 : ORACLE SERVER

작성날짜 : 2003-06-10

사용되지 않은 공간을 DEALLOCATE하는 방법
========================================

Purpose


TABLE, INDEX, CLUSTER 등의 DATABASE OBJECT들은 입력되는 자료의 양이
증가함에 따라서 새로운 EXTENT들이 자동적으로 할당된다. 이 때 필요 이상
과도한 크기의 EXTENT가 할당되면 실제로 자료가 들어있지 않거나 들어갈
예정이 없는 죽은 공간이 생길 수 있게 된다.
이러한 죽은 공간은 DISK 전체의 사용 효율을 저하시키는 원인이 되므로
적절히 제거되어야 하는데 여기서는 그 중에서 DEALLOCATE라는 방법에 
대해서 알아본다 

Explanation



1. DEALLOCATE의 대상

TABLE, INDEX, CLUSTER들이 생성된 이후에 한번도 사용되어지지 않은 공간
ORACLE에서는 이렇게 한번도 사용되지 않은 공간을 HIGH WATER MARK라는
개념으로 설명하는데 이는 다음과 같다.

* HIGH WATER MARK
TABLE_A 의 EXTENT 구조
------------------- -------------------- -------------------

EXTENT1 EXTENT2 | EXTENT3 |
 

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가 FREE된다.

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) 남아 있다.