2014년 10월 17일 금요일

Index Tablespace 사이즈 관련



데이터가 증가함에 따라 인덱스 사이즈도 증가하게 되는데, 초기에는 테이블스페이스에서 할당을 받습니다.

그 이후 데이터가 삭제가 되면, 삭제가 된 공간은 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;