by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

지역적으로 관리되는 테이블 영역 사용하기




1.DMT( Dictionary Managed Tablespace )이란.?

  • 각 object의 etents를 data dictionary table들을 사용하여 관리하는 방식이다.

    1) 장점..

    extent의 크기 를 아주 유연하게 할 수 있는 장점이 있다. 즉 하나의 tablepsace내의 서로 다른 object는 서로 다른 extent의 크기를 가질 수 있다.

    2) 단점..

    어떤 테이블에 하나의 새로운 extent가 필요할 때에는 해당 Data Dictionary Table을 참조하기 위한 여러 개의 Recursive SQL이 내부적으로 수행된다. 이것은 때때로 Performance의 저하를 초래하기도 한다.

2. LMT( Locally Managed Tablespace )이란.?

  • Oracle 8버전 부터 사용 가능하다.
  • 테이블스페이스 내의 Free space, 또는 extent를 관리하기 위해서 Data Dictionary Table을 사용하지 않는다.
  • LMT는 자체 extent에 대한 관리를 각각의 데이터 파일에 비트맵 형식으로 저장하여 관리하는 테이블스페이스이스로, 테이터 파일을 구성하는 블럭이 비어 있는지, 사용 중인지에 대한 정보를 관리 한다.
  • 익스텐트가 할당되거나, 비워지거나, 재사용 될때, 블럭의 새로운 상태를 나타내기 위해 비트맵의 값을 변경한다.
  • 변경사항들을 data dictionay table을 참조하기 위한 Recursive SQL을 사용하지 않아도 됩니다.

    1) 장점..

    공간의 정보 관리를 위한 내부 작업이 감소 한다.
    데이터 딕셔너리 테이블에 대한 경합이 감소 된다.
    extent 관리와 관련된 관련 rollback 생성이 되지 않는다.
    Tablespace에 대한 주기적인 Coalesce작업을 하지 않아도 된다. 이것은 해당 테이블스페이스내의 모든 extent에 대한 정보를 bit로 표현하기 때문에 가능하다.

3. 생성 방법..

CREATE TABLESPACE TABLESPACE_NAME 
DATAFILE 'C:\ORACLE\TEST' SIZE 100M
AUTOEXTEND ON NEXT 100M MAXSIZE 2000M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;

-DICTIONARY : 테이블스페이스에 대해 DICTIONARY TABLE을 사용하여 공간을 관리함.
-LOCAL : 테이블스페이스가에 대해 비트맵을 사용하여 Locally Managed 방식으로 공간 정보를 관리함
-AUTOALLOCATE : 테이블스페이스에 대한 익스텐트 관리를 시스템에서 관장하도록 함.
              (사용자는 익스텐트의 크기를 수동으로 지정할 수 없음)
-UNIFORM : 테이블스페이스가 동일한 크기의 익스텐트로 구성 되도록 지정함. 크기는 기본적으로 바이트 단위로 지정
           (익스텐트 크기를 KB 또는 MB 단위로 지정하기 위해서는 K 또는 M을 사용하여 지정)
          이 옵션을 사용하게 되면, DEFAULT Storage 절, MININUM EXTENT 또는 TEMPORARY 옵션을 사용할 수 없습니다.

4. TEST..

SQL*Plus: Release 10.2.0.1.0 - Production on 금 10월 30 15:25:55 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


다음에 접속됨:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> show parameter db_create_file_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest                  string      D:\ORACLE\PRODUCT\10.2.0\ORADA
                                                 TA\ORAINZEN
SQL> create tablespace system_managed extent management local;

테이블스페이스가 생성되었습니다.

SQL> create table big_table_copy tablespace system_managed
  2  as
  3  select * from intrusion_event;

테이블이 생성되었습니다.

SQL> select tablespace_name, extent_id, bytes/1024, blocks from user_extents
  2  where segment_name = 'BIG_TABLE_COPY';

TABLESPACE_NAME                 EXTENT_ID BYTES/1024     BLOCKS
------------------------------ ---------- ---------- ----------
SYSTEM_MANAGED                          0         64          8
SYSTEM_MANAGED                          1         64          8
SYSTEM_MANAGED                          2         64          8
SYSTEM_MANAGED                          3         64          8
SYSTEM_MANAGED                          4         64          8
SYSTEM_MANAGED                          5         64          8
SYSTEM_MANAGED                          6         64          8
SYSTEM_MANAGED                          7         64          8
SYSTEM_MANAGED                          8         64          8
SYSTEM_MANAGED                          9         64          8
SYSTEM_MANAGED                         10         64          8

TABLESPACE_NAME                 EXTENT_ID BYTES/1024     BLOCKS
------------------------------ ---------- ---------- ----------
SYSTEM_MANAGED                         11         64          8
SYSTEM_MANAGED                         12         64          8
SYSTEM_MANAGED                         13         64          8
SYSTEM_MANAGED                         14         64          8
SYSTEM_MANAGED                         15         64          8
SYSTEM_MANAGED                         16       1024        128
SYSTEM_MANAGED                         17       1024        128
SYSTEM_MANAGED                         18       1024        128
SYSTEM_MANAGED                         19       1024        128
SYSTEM_MANAGED                         20       1024        128
SYSTEM_MANAGED                         21       1024        128

22 개의 행이 선택되었습니다.

이것을 알고리즘이라고 표현하는데 어떤 알고리즘인지 이해가 안되어요 ㅠ..ㅠ(64KB(16) -> 1M(63) -> 8MB(14))

SQL> drop table big_table_copy;

테이블이 삭제되었습니다.

SQL> --객체의 궁극적인 크기를 알고있을 경우
SQL> create tablespace uniform_size
  2  extent management local
  3  uniform size 5m
  4  /

테이블스페이스가 생성되었습니다.

SQL> select tablespace_name, extent_id, bytes/1023, blocks
  2  from user_extents
  3  where segment_name = 'BIG_TABLE_COPY'
  4  /

TABLESPACE_NAME                 EXTENT_ID BYTES/1023     BLOCKS
------------------------------ ---------- ---------- ----------
UNIFORM_SIZE                            0 5125.00489        640
UNIFORM_SIZE                            1 5125.00489        640

5 LMT에 관한 몇가지 주의 사항..

1) 획일적인 크기의 익스텐트용 매직 넘버는 64KB이다.

  • LMT에서 Free Extent를 관리 하기 위해서 사용하는 Bitmap의 크기는 64KB이다.
    SQL> create tablespace five_meg
      2  datafile size 100m
      3  uniform size 5m
      4  /
    
    테이블스페이스가 생성되었습니다.
    
    SQL> --사용 가능한 공간이 얼마나 있는지 확인하기
    SQL> select sum(bytes/1024/1024) free_space
      2  from dba_free_space
      3  where tablespace_name = 'FIVE_MEG'
      4  /
    
    FREE_SPACE
    ----------
            95
    
    SQL> col file_name new_val f
    SQL> select file_name from dba_data_files where tablespace_name ='FIVE_MEG';
    
    FILE_NAME
    --------------------------------------------------------------------------------
    D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORAINZEN\ORAINZEN\DATAFILE\O1_MF_FIVE_MEG_5GO8H
    5R0_.DBF
    
    104857600(100M) + 65536(64K) = 104923136 ( 확대할 사이즈  = 102464k )
    
    SQL> alter database
      2  datafile '&f' resize 102464k;
    구   2: datafile '&f' resize 102464k
    신   2: datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORAINZEN\ORAINZEN\DATAFILE\O1_MF_FIVE_MEG_5GO8H5R
    
    데이타베이스가 변경되었습니다.
    
    SQL> select sum(bytes/1024/1024) free_space
      2  from dba_free_space
      3  where tablespace_name = 'FIVE_MEG';
    
    FREE_SPACE
    ----------
           100
    
    
    

2) 시스템에 의해 관리되는 LMT는 파일과 다르게 할당한다.

  • 시스템에 관리되는 익스텐트를 사용하는 기법도 라운드 로빈 방식을 이용한다.
  • 라운드 로빈 방식 : 그룹 내에 있는 모든 요소들을 합리적인 순서에 입각하여 뽑는 방법으로서, 대개 리스트의 맨 위에서 아래로 가면서 하나 씩
    뽑고, 끝나면 다시 맨위로 돌아가는 식으로 진행된다. 쉽게 말해 라운드 로빈은 기회를 차례로 받기라고 이해해도 좋을 것이다.
    SQL> create tablespace uniform_extents
      2  datafile 'd:\oracle\testing.dbf' size 2112k, size 2112k, size 2112k, size 2112
      3  uniform size 64k
      4  /
    
    테이블스페이스가 생성되었습니다.
    
    SQL> create tablespace system_managed
      2  datafile size 2112k, size 2112k, size 2112k, size 2112k
      3  /
    
    테이블스페이스가 생성되었습니다.
    
    SQL> create table uniform_size( x int, y char(2000))
      2  tablespace uniform_extents;
    
    테이블이 생성되었습니다.
    
    SQL> create table system_size ( x int, y char( 2000 ) )
      2  tablespace system_managed;
    
    테이블이 생성되었습니다.
    
    SQL> begin
      2  loop
      3  insert into uniform_size values( 1, 'x');
      4  commit;
      5  end loop;
      6  end;
      7  /
    begin
    *
    1행에 오류:
    ORA-01653: ERM.UNIFORM_SIZE 테이블을 8(으)로 UNIFORM_EXTENTS 테이블스페이스에서
    확장할 수 없습니다
    ORA-06512: 줄 3에서
    
    
    SQL> begin
      2  loop
      3  insert into system_size values(1,'x');
      4  commit;
      5  end loop;
      6  end;
      7  /
    begin
    *
    1행에 오류:
    ORA-01653: ERM.SYSTEM_SIZE 테이블을 128(으)로 SYSTEM_MANAGED 테이블스페이스에서
    확장할 수 없습니다
    ORA-06512: 줄 3에서
    
    SQL> select segment_name, extent_id, blocks, file_id
      2  from dba_extents
      3  where segment_name in ( 'UNIFORM_SIZE', 'SYSTEM_SIZE')
      4  and owner= user
      5  order by segment_name, extent_id
      6  /
    
    SEGMENT_NAME                    EXTENT_ID     BLOCKS    FILE_ID
    \-----------------------------\- \---------\- \---------\- \---------\-
    SYSTEM_SIZE                             0          8         12
    SYSTEM_SIZE                             1          8         12
    SYSTEM_SIZE                             2          8         12
    SYSTEM_SIZE                             3          8         12
    SYSTEM_SIZE                             4          8         12
    SYSTEM_SIZE                             5          8         12
    SYSTEM_SIZE                             6          8         12
    SYSTEM_SIZE                             7          8         12
    SYSTEM_SIZE                             8          8         12
    SYSTEM_SIZE                             9          8         12
    SYSTEM_SIZE                            10          8         12
    SYSTEM_SIZE                            11          8         12
    SYSTEM_SIZE                            12          8         12
    SYSTEM_SIZE                            13          8         12
    SYSTEM_SIZE                            14          8         12
    SYSTEM_SIZE                            15          8         12
    SYSTEM_SIZE                            16        128         20
    SYSTEM_SIZE                            17        128         21
    SYSTEM_SIZE                            18        128         22
    SYSTEM_SIZE                            19        128         12
    SYSTEM_SIZE                            20        128         20
    SYSTEM_SIZE                            21        128         21
    SYSTEM_SIZE                            22        128         22
    출력을 보면 시스템에 의해 할당된 테이블 영역의 첫 번째 16개의 익스텍트는
    모두 같은 파일(FILE_ID 22)로부터 할당되었다. 오라클이 다수의 작은 익스텐트를
    여러 개의 서로 다른 파일에서 할당하지 않고 이렇게 한 이유는 이 테이블 영역으로부터
    개체를 삭제할 경우 발생할지도 모르는 단편화를 줄이기 위함이다.
    익스템트가 8블록(64KB)에서 128블록(1MB)으로 뛸 때에만 라운드 로빈 알고리즘이
    동작한다. 일단 1MB 익스텐트에 도달하면서 파일 12,23,21,22 순으로 할당된다.
    
    UNIFORM_SIZE                            0          8         16
    UNIFORM_SIZE                            1          8         17
    UNIFORM_SIZE                            2          8         18
    ...
    UNIFORM_SIZE                          118          8         18
    UNIFORM_SIZE                          119          8         19
    UNIFORM_SIZE                          120          8         16
    UNIFORM_SIZE                          121          8         17
    UNIFORM_SIZE                          122          8         18
    UNIFORM_SIZE                          123          8         19
    UNIFORM_SIZE                          124          8         16
    UNIFORM_SIZE                          125          8         17
    UNIFORM_SIZE                          126          8         18
    UNIFORM_SIZE                          127          8         19
    
    151 rows selected.
    
    uniform size 가 지정된 경우 획일적인 크기의 익스텐트에서는 단편화가 관심사가
    아니므로 처음부터 라운드 로빈 할당이 사용된다.
    
    

문서에 대하여

  • 최초작성자 : 장태길 , 재판 : 이재현
  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • 이 문서의 내용은 THOMAS KYTE 저, 박민호 역의 이펙티브오라클을 참고했습니다.

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.