데이터가 증가함에 따라 인덱스 사이즈도 증가하게 되는데, 초기에는 테이블스페이스에서 할당을 받습니다.
그 이후 데이터가 삭제가 되면, 삭제가 된 공간은 empty_node가 되며, 해당 인덱스에서 재사용을 하게 됩니다.
empty_node들은 해당 인덱스에서는 재사용되지만, 다른 인덱스에서는 사용하실 수가 없습니다.
그래서 X$SEGMENT의 alloc_page의 값을 조회 시에는 계속 같은 사이즈로 나오게 됩니다.
인덱스에 할당된 empty_node들을 테이블스페이스로 반환하는 방법으로는 아래와 같습니다.
(1) 해당 인덱스 drop & create
(2) 해당 테이블 truncate
(3) gliese restart ( 인덱스는 따로 옵션을 지정하지 않으면, 디폴트로 startup시 재 빌드 됩니다.)
아래의 쿼리는 해당 인덱스에 할당된 사이즈, 사용되는 사이즈, free 사이즈를 구하는 쿼리입니다.
SELECT table_name, index_name, alloc_page_count*8192/1024/1024 "TOTAL SIZE (MB)", (alloc_page_count-empty_node_count)*8192/1024/1024 "USED SIZE (MB)", xih.EMPTY_NODE_COUNT*8192/1024/1024 "FREE SIZE (MB)" FROM X$SEGMENT xst, INDEXES ind, INDEX_KEY_TABLE_USAGE iktu, TABLES tbl, x$index_header xih WHERE xst.physical_id = ind.physical_id and ind.index_id = iktu.index_id and iktu.table_id = tbl.table_id and ind.physical_id = xih.physical_id and xst.tbs_id=5; |