[답변] EXTENT 관련 질문입니다. 0 4 2,337

by TeLl2 [2009.07.21 15:48:46]


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들을 모두 반납하게 됩니다.
따라서 공간이 확보 되는겁니다.

충분한 답변이 되었는지 모르겠네요.

by 질문人 [2009.07.22 00:02:34]
아~~~ 그렇군요!!
자세한 설명까지~
답변 감사드립니다 ^^

by 질문人 [2009.07.22 00:20:07]
하나면 더 질문 드려도 될까요? ^^;;;
freespace가 없어도 dba_freespace에 검색은 되지 않나요?
no row select로 나오던데.....
그럼 freespace가 없는 tablespace가 존재 할 경우
alert log나 데이터 입력시 에러 발생으로만 확인이 가능한 건가요?

by TeLl2 [2009.07.22 00:32:38]
dba_free_space 뷰는 데이터베이스 내의 모든 테이블 스페이스의
free extents 를 정보를 볼수 있는 뷰입니다.
freespace가 없다면 해당 뷰에서는 어떠한 정보도 출력되지 않습니다.
다만 위와 같은 에러가 발생시 alert log 로그를 남기게 됩니다.

by 질문人 [2009.07.22 09:45:20]
넵~ 감사합니다 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입