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 가 지정된 경우 획일적인 크기의 익스텐트에서는 단편화가 관심사가
아니므로 처음부터 라운드 로빈 할당이 사용된다.

문서정보

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