LMT(Locally Managed Tablespace)사용하기작성일: 2002-11-11
작성자: 강명규(kang@dbakorea.pe.kr)
OS: Linux 2.4.19
Oralce: Oracle EE 8.1.7
미리 말하자면, 당신의 오라클서버가 이 기능을 지원한다면 무조건 이 기능을 사용하라.
오라클은 tablespace, extent, data block 이라는 관점에서 공간할당(Space Allocation)을 관리한다.
간단히 data block < extent < tablespace 라고 생각하면 되겠다.
data block은 보통 몇개의 OS블럭으로 구성되는 DB의 기본 I/O단위가 된다.
extent는 또 몇개의 오라클 data block으로 구성된다.
보통 테이블등의 오브젝트는 이 extent단위로 할당을 받아 segment를 이루게 된다.
tablespace는 이 모든 것들을 포함하는 컨테이너로서의 역활을 수행한다.
Dictionary managed tablespaces
별다른 조치를 하지 않았다면 테이블스페이스의 공간할당에 대한 관리는
다른 오브젝트와 동일하게 Data Dictionary가 한다.
오라클 8.0.x이전 버전의 경우, 이것만이 가용한 방식이다.
Locally Managed Tablespaces (LMT)
하지만 8.1.x이후부터는 '테이블스페이스에 의한 extent관리'라고 불리는 공간할당관리옵션을 사용할 수 있다.
테이블스페이스에 대한 extent allocation 관리를 해당 테이블스페이스 자신이 스스로 할 수 있다는 것이다.
즉, 성능병목현상을 유발할 수 있는 Data Dictionary에 의한 관리로부터 벗어날 수 있다는 것이다.
이러한 테이블스페이스는 자신이 소유한 각 데이터파일에 대한 블럭의 사용유무를 추적하기 위해 '비트맵'을 유지한다.
비트맵내의 각 비트(bit)는 블럭 혹은 블럭들의 그룹에 해당한다.
LMT의 장점
1. temporary tablespace에 적합하게 사용될 수 있다.
2. 주기적인 tablespace의 coalesce가 불필요하다.
(tablespace의 coalesce를 모른다면 자신이 DBA인가 의심하십시오)
3. 모든 extent는 균등한 크기를 갖게 하며, 테이블스페이스레벨에서 이를 강제하여
사용자의 잘못된 extent크기지정의 위험을 피할 수 있다.
주의점
1. temporary tablespace에는 UNIFORM extent allocation만 가능
2. NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS, and DEFAULT STORAGE 저장옵션은 유효하지 않다.
EXTENT할당 방식
오라클이 새로운 extent를 할당할 수 있는 자유공간을 찾는 방식은 다음과 같다.
해당 테이블스페이스가 소유한 데이터파일들중 한 놈을 선택, 그 데이터파일의 '비트맵'을 검색하여
요구되는 개수의 인접 자유블럭(adjacent free block)을 가진 놈을 찾는다.
만일, 데이터파일이 충분한 인접자유공간을 가지고 있지 못한다면, 또다른 놈을 검색할 것이다.
extent가 할당해제될때, 오라클은 해당 데이터파일의 비트맵을 수정한다.
EXTENT할당(Extent Allocation)방식에는 2가지가 있다.
Automatic Extent Allocation
사용자는 초기 extent크기만을 결정하고, 이후의 추가적인 extent는 오라클이 결정한다.
(이때, extent크기는 64KB, 1MB, 8MB, 64MB 순으로 사용될 것이다. )
SQL> create tablespace ts_dbakorea_lmt_auto
2 datafile '/u01/app/oracle/oradata/db/ts_dbakorea_lmt_auto01.dbf' size 10m
3 extent management local autoallocate;
Tablespace created.
SQL>
Uniform Extent Allocation
생성될 extent크기를 사용자가 정할 수 있다.(default: 1MB)
이후, 생성되는 모든 extent는 초기에 정한 이 extent의 크기를 가지게 된다.
따라서, 이 테이블스페이스내에서 생성되는 테이블, 인덱스등은 모두 같은(균등한) extent크기를 가지게 될 것이다.
당연히 tablespace의 fragmetation은 발생하지 않으므로, coalesce과정이 필요없다.
SQL> create tablespace ts_dbakorea_lmt_uni
2 datafile '/u01/app/oracle/oradata/db/ts_dbakorea_lmt_uni01.dbf' size 10m
3 extent management local uniform size 1m;
Tablespace created.
SQL>
자, 그럼 dba_tablespaces에 질의하여 tablespace의 정보를 확인해 보자.
당연히, TS_DBAKOREA_LMT_UNI, TS_DBAKOREA_LMT_AUTO는 extent_management가 local로 되어 있다.
allocation_type은 uniform의 경우 UNIFORM으로, AUTOALLOCATE의 경우 SYSTEM으로 되어 있음을 알수 있다.
특의하게 TS_DBAKOREA_LMT_AUTO의 경우 NEXT_EXTENT가 정해져 있지 않음을 유의하자.
SQL> select tablespace_name, initial_extent, next_extent, min_extents, max_extents,
2 pct_increase, extent_management, allocation_type
3 from dba_tablespaces;
TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE EXTENT_MAN ALLOCATIO
-------------------- -------------- ----------- ----------- ----------- ------------ ---------- ---------
SYSTEM 65536 65536 1 2147483645 50 DICTIONARY USER
RBS 524288 524288 8 4096 50 DICTIONARY USER
TOOLS 32768 32768 1 4096 0 DICTIONARY USER
TEMP 65536 65536 1 0 DICTIONARY USER
USERS 131072 131072 1 4096 0 DICTIONARY USER
INDX 131072 131072 1 4096 0 DICTIONARY USER
TS_DBAKOREA_LMT_UNI 1048576 1048576 1 2147483645 0 LOCAL UNIFORM
TS_TEST 20480 20480 1 249 50 DICTIONARY USER
TS_CORRUPT_TEST 20480 20480 1 249 50 DICTIONARY USER
TS_TEMP 20480 20480 1 249 50 DICTIONARY USER
TS_DBAKOREA_LMT_AUTO 65536 1 2147483645 LOCAL SYSTEM
11 rows selected.
SQL>
AUTOALLOCATE의 경우, 처음 테이블의 크기(처음 EXTENT의 크기)는 64KB부터 시작한다.
테이블의 크기가 1MB가 될때까지 EXTENT는 64KB단위로 증가하고, 1MB가 된 이후부터는
EXTENT의 크기가 1MB단위로 증가하게 된다. 이후부터는 약간 다른데 64MB가 되었을때 8MB,
1GB가 되었을때 64MB단위로 EXTENT가 증가하게 된다. 따라서 위의 질의에서 NEXT_EXTENT가
명확히 보이지 않는 것이다.
LMT의 경우에서, EXTENT의 크기는 테이블스페이스 레벨에서만 관리되어 진다.
즉, LMT내의 테이블등의 오브젝트는 모두 테이블스페이스의 저장옵션을 따라 정해진다.
temporary tablespace를 locally managed로 변환하기
SQL> drop tablespace temp;
Tablespace dropped.
SQL> create temporary tablespace temp
2 tempfile '/u01/app/oracle/oradata/db/ts_temp_lmt_uni01.dbf' size 10m
3 extent management local uniform size 2m;
Tablespace created.
SQL> select tablespace_name, initial_extent, next_extent, min_extents, max_extents,
2 pct_increase, extent_management, allocation_type
3 from dba_tablespaces;
TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE EXTENT_MAN ALLOCATIO
------------------------------ -------------- ----------- ----------- ----------- ------------ ---------- ---------
SYSTEM 65536 65536 1 2147483645 50 DICTIONARY USER
RBS 524288 524288 8 4096 50 DICTIONARY USER
TOOLS 32768 32768 1 4096 0 DICTIONARY USER
TEMP 2097152 2097152 1 0 LOCAL UNIFORM
USERS 131072 131072 1 4096 0 DICTIONARY USER
INDX 131072 131072 1 4096 0 DICTIONARY USER
TS_DBAKOREA_LMT_UNI 1048576 1048576 1 2147483645 0 LOCAL UNIFORM
TS_TEST 20480 20480 1 249 50 DICTIONARY USER
TS_CORRUPT_TEST 20480 20480 1 249 50 DICTIONARY USER
TS_DBAKOREA_LMT_AUTO 65536 1 2147483645 LOCAL SYSTEM
10 rows selected.
이렇게 생성된 temporary tablespace는 v$datafile이 아닌 v$tempfile에서만 보여진다.
SQL> select name from v$datafile;
NAME
----------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/db/system01.dbf
/u01/app/oracle/oradata/db/rbs01.dbf
/u01/app/oracle/oradata/db/tools01.dbf
/u01/app/oracle/oradata/db/users01.dbf
/u01/app/oracle/oradata/db/indx01.dbf
/u01/app/oracle/oradata/db/ts_corrupt_test01.dbf
/u01/app/oracle/oradata/db/ts_test01.dbf
/u01/app/oracle/oradata/db/ts_dbakorea_lmt_uni01.dbf
/u01/app/oracle/oradata/db/ts_dbakorea_lmt_auto01.dbf
9 rows selected.
SQL> select name from v$tempfile;
NAME
----------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/db/ts_temp_lmt_uni01.dbf
SQL>
더 많은 내용을 원한다면 dba_free_space, dba_extents뷰도 확인해보면 좋을 것이다.
이제 dictionary managed tablespace를 locally managed tablespace로 변경해 보겠다.
상호간의 변경은 8.1.6이상에서만 가능하므로 주의하기 바란다. 현재 필자는 8.1.7에서 테스트했다.
8.1.5는 locally managed tablespace -> dictionary managed tablespace 로의 변환만이 가능하다고 한다.
locally managed tablespace -> dictionary managed tablespace : DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL
dictionary managed tablespace -> locally managed tablespace : DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL
temporary와 system tablespace는 locally managed 에서 dictionary-managed로 변환이 불가능하다.
SYSTEM의 경우, 새로 DATABASE를 생성할때 할 수 밖에.. 다른 방법이 있으려나?
오라클사는 locally managed tablespace를 사용하기를 권장하고 있므로 지금부터 바꿔보는 것은 어떨까?
SQL> select tablespace_name, extent_management, allocation_type
2 from dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN ALLOCATIO
------------------------------ ---------- ---------
SYSTEM DICTIONARY USER
RBS DICTIONARY USER
TOOLS DICTIONARY USER
TEMP LOCAL UNIFORM
USERS DICTIONARY USER
INDX DICTIONARY USER
TS_DBAKOREA_LMT_UNI LOCAL UNIFORM
TS_TEST DICTIONARY USER
TS_CORRUPT_TEST DICTIONARY USER
TS_DBAKOREA_LMT_AUTO LOCAL SYSTEM
10 rows selected.
SQL> exec dbms_space_admin.tablespace_migrate_to_local('TOOLS');
PL/SQL procedure successfully completed.
SQL> exec dbms_space_admin.tablespace_migrate_to_local('RBS');
PL/SQL procedure successfully completed.
SQL> exec dbms_space_admin.tablespace_migrate_to_local('USERS');
PL/SQL procedure successfully completed.
SQL> exec dbms_space_admin.tablespace_migrate_to_local('INDX');
PL/SQL procedure successfully completed.
SQL> exec dbms_space_admin.tablespace_migrate_to_local('TS_TEST');
PL/SQL procedure successfully completed.
SQL> exec dbms_space_admin.tablespace_migrate_to_local('TS_CORRUPT_TEST');
PL/SQL procedure successfully completed.
SQL> select tablespace_name, extent_management, allocation_type
2 from dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN ALLOCATIO
------------------------------ ---------- ---------
SYSTEM DICTIONARY USER
RBS LOCAL USER
TOOLS LOCAL USER
TEMP LOCAL UNIFORM
USERS LOCAL USER
INDX LOCAL USER
TS_DBAKOREA_LMT_UNI LOCAL UNIFORM
TS_TEST LOCAL USER
TS_CORRUPT_TEST LOCAL USER
TS_DBAKOREA_LMT_AUTO LOCAL SYSTEM
10 rows selected.
SQL> select tablespace_name, initial_extent, next_extent, min_extents, max_extents,
2 pct_increase, extent_management, allocation_type
3 from dba_tablespaces;
TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE EXTENT_MAN ALLOCATIO
------------------------------ -------------- ----------- ----------- ----------- ------------ ---------- ---------
SYSTEM 65536 65536 1 2147483645 50 DICTIONARY USER
RBS 524288 524288 8 4096 50 LOCAL USER
TOOLS 32768 32768 1 4096 0 LOCAL USER
TEMP 2097152 2097152 1 0 LOCAL UNIFORM
USERS 131072 131072 1 4096 0 LOCAL USER
INDX 131072 131072 1 4096 0 LOCAL USER
TS_DBAKOREA_LMT_UNI 1048576 1048576 1 2147483645 0 LOCAL UNIFORM
TS_TEST 20480 20480 1 249 50 LOCAL USER
TS_CORRUPT_TEST 20480 20480 1 249 50 LOCAL USER
TS_DBAKOREA_LMT_AUTO 65536 1 2147483645 LOCAL SYSTEM
10 rows selected.
SQL>
'Oracle > oracle' 카테고리의 다른 글
KSC5601 -> UTF8로 마이그레이션시 이슈 (0) | 2009.12.10 |
---|---|
Oracle 10g 에서 SQL-LOADER 의 성능 향상 TIP (0) | 2009.12.10 |
INTRODUCTION TO PARALLEL DML (0) | 2009.09.02 |
모든 DML을 INSERT로 변경하자 (0) | 2009.07.08 |
Oracle Built-in Datatypes (0) | 2009.07.05 |