TABLE SEGMENT/EXTENT 내의 FREE SPACE/USED SPACE USAGE 확인 방법
Data를 보유 중인 table segment에 다양한 DML 문장의 수행으로 인하여 free space가 발생하게 되는 경우, table segment 내에 free space가 얼마나 존재하는지 확인하는 방법입니다.
기본적으로 segment는 extent 단위로 space를 할당받게 되어 있으며, 한번 할당된 extent는 사용되지 않는 경우에도 지속적으로 유지됩니다.
( 'alter table ... deallocate unused' command를 사용하는 경우는 제외 )
이러한 경우, data segment 내의 free space를 확인함으로 해서 load되는
data를 위하여 space를 할당할 것인가? 할당한다면 어느 정도의 space를
할당하여야 하는가? 라는 사항에 대하여 적절한 결정이 가능하게 되며, dba_tables/user_tables의 avg_space column의 값을 사용하여 산출됩니다.
Segment 내의 free space를 확인하는 방법
1. 대상 table에 대하여 analyze command를 compute option으로 수행.
SQL> analyze table dept compute statistics;
2. dba_tables 또는 user_tables view의 empty_blocks, blocks, avg_space
column을 확인.
SQL> select table_name, empty_blocks, blocks, avg_space
from user_tables
where table_name='DEPT';
empty_blocks : 아직 format(or 사용)되지 않은 block 수 = High Water
Mark 이후의 block 수.
blocks : data가 한 번이라도 쓰여졌던 block 수 = High Water
Mark 이전의 block 수.
avg_space : 사용된 block의 평균 free space (bytes 단위)
3. blocks * avg_space + empty_blocks * db_block_size 의 결과가 해당
segment 내의 free space 입니다.
< 주의 > 실제 data가 load될 수 있는 공간은 3 step의 결과보다 작아지게
됩니다. Format이 수행되지 않았던 block이 사용되면서 block
header 정보가 기록되게 되므로, empty_blocks의 block 당 일정
space가 실제 data의 load에 사용될 수 없게 됩니다.
4. 이 free space size를 이용하여 현재 table에 실제 차지하고 있는 space를
확인하는 방법은 다음과 같다.
select bytes from dba_segments where segment_name = 'DEPT';
여기에서 얻은 bytes 값에서 3에서 얻은 free space를 빼면 된다.
|