본문 바로가기

DB/DBA

Segments와 Extents를 Tablespace관점에서 이해하기.

일반적인 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/