일반적인 DML(insert, update, delete) 구문으로는 기존에 사용하고
이미 allocation 된 extent 를 반환하기 않습니다.
truncate 하시면 free size 가 증가합니다.
제가 다른 용도로 테스트 중 로그 입니다.
-----------------------------------------------------------------------
SQL> create table check_con
( a1 number, a2 varchar2(100)) tablespace check_last ;
Table created.
SQL> alter table check_con add constraint XPKcheck_on primary key
( a1 ) using index tablespace check_last_i ;
Table altered.
SQL> select segment_name, segment_type, file_id, extent_id, block_id, bytes/1024/1024, blocks
2 from dba_extents where file_id in ( 8,10,11,12 ) ;
SEGMENT_NAME SEGMENT_TYPE FILE_ID EXTENT_ID BLOCK_ID BYTES/1024/1024 BLOCKS
-------------------- ------------------ ---------- ---------- ---------- --------------- ----------
CHECK_CON TABLE 11 0 9 1 128
XPKCHECK_ON INDEX 12 0 9 1 128
==> 하나의 데이타 화일만 사용하는 것으로 파악 된다.
initial extent size 가 커다란 테이블이면 상황이 달라졌을 것이라 [ 데이타 화일을 분산해서 사용 ]
추측되어지면 임의로 row를 insert 시킨 후 데이타 화일 사용 현황을 살표 보자.
SQL> begin
2 for nloopinex in 1..100000 loop
3 insert into check_con values
4 (nloopinex, 'Check Allocation');
5 end loop ;
6 end ;
7 /
PL/SQL procedure successfully completed.
SQL> commit ;
Commit complete.
SQL> select segment_name, segment_type, file_id, extent_id, block_id, bytes/1024/1024, blocks
2 from dba_extents where file_id in ( 8,10,11,12 ) ;
SEGMENT_NAME SEGMENT_TYPE FILE_ID EXTENT_ID BLOCK_ID BYTES/1024/1024 BLOCKS
-------------------- ------------------ ---------- ---------- ---------- --------------- ----------
CHECK_CON TABLE 11 0 9 1 128
CHECK_CON TABLE 8 1 9 1 128
CHECK_CON TABLE 11 2 137 1 128
XPKCHECK_ON INDEX 12 0 9 1 128
XPKCHECK_ON INDEX 10 1 9 1 128
==> 예상했던 것처럼 next extent 를 발생 시킬때 나머지 데이타 화일에 extent 를 allocation 한다.
SQL> delete check_con ;
100000 rows deleted.
SQL> commit ;
Commit complete.
SQL> select segment_name, segment_type, file_id, extent_id, block_id, bytes/1024/1024, blocks
2 from dba_extents where file_id in ( 8,10,11,12 ) ;
SEGMENT_NAME SEGMENT_TYPE FILE_ID EXTENT_ID BLOCK_ID BYTES/1024/1024 BLOCKS
-------------------- ------------------ ---------- ---------- ---------- --------------- ----------
CHECK_CON TABLE 11 0 9 1 128
CHECK_CON TABLE 8 1 9 1 128
CHECK_CON TABLE 11 2 137 1 128
XPKCHECK_ON INDEX 12 0 9 1 128
XPKCHECK_ON INDEX 10 1 9 1 128
==> 비록 row는 DELETE 되었지만 일딴 Table 과 Index 에 Allocation 된 extent 는 환원되지 않았다.
SQL> begin
2 for nloopinex in 1..100000 loop
3 insert into check_con values
4 (nloopinex, 'Check Allocation');
5 end loop ;
6 end ;
7 /
PL/SQL procedure successfully completed.
SQL> commit ;
Commit complete.
SQL> select segment_name, segment_type, file_id, extent_id, block_id, bytes/1024/1024, blocks
2 from dba_extents where file_id in ( 8,10,11,12 ) ;
SEGMENT_NAME SEGMENT_TYPE FILE_ID EXTENT_ID BLOCK_ID BYTES/1024/1024 BLOCKS
-------------------- ------------------ ---------- ---------- ---------- --------------- ----------
CHECK_CON TABLE 11 0 9 1 128
CHECK_CON TABLE 8 1 9 1 128
CHECK_CON TABLE 11 2 137 1 128
XPKCHECK_ON INDEX 12 0 9 1 128
XPKCHECK_ON INDEX 10 1 9 1 128
SQL> truncate table check_con ;
Table truncated.
SQL> select segment_name, segment_type, file_id, extent_id, block_id, bytes/1024/1024, blocks
2 from dba_extents where file_id in ( 8,10,11,12 ) ;
SEGMENT_NAME SEGMENT_TYPE FILE_ID EXTENT_ID BLOCK_ID BYTES/1024/1024 BLOCKS
-------------------- ------------------ ---------- ---------- ---------- --------------- ----------
CHECK_CON TABLE 11 0 9 1 128
XPKCHECK_ON INDEX 12 0 9 1 128
==> Truncate 경우엔 initial extent 로 resize 하고 확장된 extent 는 oracle 에 환원!!!
좋은 하루 되세요...
출처 : http://www.oracleclub.com/