by 구루비스터디 DMT LMT Dictionary Managed Tablespace Locally Managed Tablespace [2018.05.26]
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 옵션을 사용할 수 없습니다.
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
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
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 가 지정된 경우 획일적인 크기의 익스텐트에서는 단편화가 관심사가
아니므로 처음부터 라운드 로빈 할당이 사용된다.
- 강좌 URL : http://www.gurubee.net/lecture/3475
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.