segment의 extent 할당은 테이블 스페이스 생성시 정의 하게 됩니다.
AUTOALLOCATE 혹은 UNIFORM SIZE로 정의하게 되는데
해당 테이블 스페이스에 생성되는 세그멘트의 extent 할당을 정의하게 됩니다.
AUTOALLOCATE의 경우 시스템이 extent의 크기를 알아서 할당합니다.
처음 16개의 익스텐트는 64K(8 block), 17개 부터는 1024K(128block),
이후 몇개 이상의 경우는 8M(1024block), 64M(8192block).....
이런식으로 증가량이 많은 segment의 경우는 extent할당을 크게 가져 갑니다.
uniform size 1M 로 지정시 해당 테이블 스페이스에 생성되는 모든 segment는
1M로 extent를 할당 받습니다.
위에 테스트 하신 테이블 스페이스의 정의가 autoallocate일 겁니다.
확인해 보세요.
SQL> select block_id, blocks, bytes/1024||’K’ "SIZE" from dba_free_space where tablespace_name=’TEST_TBS’ order by block_id;
BLOCK_ID BLOCKS SIZE
---------- ---------- -----------------------------------------
153 104 832K
한번 데이터를 입력할 때마다 64블럭이 사용됨을 확인 했습니다.
여기서 한번더 동일한 데이터를 teste5 테이블에 입력하였더니 아래와 같은 에러가 발생하면서 중단되었습니다.
블럭은 104블럭에서 48블럭이 남았습니다.
ERROR at line 1:
ORA-01653: unable to extend table SYS.TESTE05 by 128 in tablespace TEST_TBS
ORA-06512: at line 6
104 개의 블럭이 남았고
TESTE05에 9개의 extent가 할당 되었고 앞으로 7개가 더 8블럭자리로 할당 할 수 있습니다.
따라서 *7 = 56 블럭 사용
이제 부터는 128 블럭을 사용해야 하지만 104 - 56 = 48 블럭만이 남아 있으므로
128 블럭을 할당 할 수 없다는 에러 발생.
SQL> select block_id, blocks, bytes/1024|| ’K’ "SIZE" from dba_free_space where tablespace_name=’TEST_TBS’;
BLOCK_ID BLOCKS SIZE
---------- ---------- -----------------------------------------
209 48 384K
SQL> select segment_name, extent_id, block_id, blocks, bytes/1024||’k’ "size" from dba_extents
2 where tablespace_name=’TEST_TBS’
3 ORDER BY SEGMENT_NAME, EXTENT_ID;
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE04
0 9 8 64k
TESTE04
1 25 8 64k
TESTE04
2 33 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE04
3 41 8 64k
TESTE04
4 49 8 64k
TESTE04
5 57 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE04
6 65 8 64k
TESTE04
7 73 8 64k
TESTE04
8 81 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE04
9 209 8 64k
TESTE04
10 217 8 64k
TESTE04
11 225 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE04
12 233 8 64k
TESTE04
13 241 8 64k
TESTE04
14 249 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE05
0 17 8 64k
TESTE05
1 89 8 64k
TESTE05
2 97 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE05
3 105 8 64k
TESTE05
4 113 8 64k
TESTE05
5 121 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE05
6 129 8 64k
TESTE05
7 137 8 64k
TESTE05
8 145 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE05
9 153 8 64k
TESTE05
10 161 8 64k
TESTE05
11 169 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE05
12 177 8 64k
TESTE05
13 185 8 64k
TESTE05
14 193 8 64k
SEGMENT_NAME
--------------------------------------------------------------------------------
EXTENT_ID BLOCK_ID BLOCKS size
---------- ---------- ---------- -----------------------------------------
TESTE05
15 201 8 64k
teste04번에 같은 데이터를 입력한 해 보니 아래와 같은 에러가 발생하였습니다.
*
ERROR at line 1:
ORA-01653: unable to extend table SYS.TESTE04 by 8 in tablespace TEST_TBS
ORA-06512: at line 6
48개 블럭으로는 TEST04에 6개의 extent만을 할당할 수 있습니다.
고로 16번째 extent를 할당 하면서 8개의 블럭을 할당 할 수 없다는 에러가 발생하는 것입니다.
그리고 그 후부터 해당 테이블들이 들어 있는 테이블 스페이스(TEST_TBS)는
DBA_FREESPACE에서 없는 테이블스페이스처럼 검색이 되지 않았고
테이블을 drop 하니 다시 dba_freespace에서 검색이 되었습니다.
freespace 가 없는 이유는 위에 설명이 된거 같구요.
테이블을 드랍했을 경우는 사용했던 extent들을 모두 반납하게 됩니다.
따라서 공간이 확보 되는겁니다.
충분한 답변이 되었는지 모르겠네요.