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