반응형
/********************************************************************************************
-- Title : [9i] Extent 관리 방식(Locally 代 dictionary)
-- Reference : 웹검색
-- Key word : extent locally dictionary 익스텐트
********************************************************************************************/

Tablespace 내의 extent를 관리하는 방식을 지정할 수 있는
'extent_management_clause'가 Oracle8i의 CREATE TABLESPACE 문에 추가되었다.
이 clause에는 다음과 같은 parameter를 지정할 수가 있다.
- DICTIONARY :
tablespace 내의 extent들이 dictionary table에서 관리됨
이 값을 지정하면 기존의 방식과 동일하게 운용되며, 이 값이 default이다.

- LOCAL :
tablespace 내의 extent들이 각 구성 datafile내에서 bitmap으로 관리됨

* AUTOALLOCATE : tablespace 내의 각 extent size를 system이 관리함.
user가 extent의 size를 지정할 수 없음.

* UNIFORM : tablespace내의 각 extent size는 user가 지정한 일정한
size로만 생성됨. 이때 default size는 1MB임.
만약 LOCAL 절을 사용하면서 AUTOALLOCATE 또는 UNIFORM을 명시하지 않는다면
AUTOALLOCATE가 default로 이용됨.

UNIFORM SIZE를 지정할 경우, Oracle은 항상 SORT_AREA_SIZE에 지정된 크기의
배수를 이용하게 된다.  代代
예를 들어,
SORT_AREA_SIZE가 64K로 설정되어 있고,
CREATE TABLESPACE 문의 UNIFORM SIZE절에 32K를 지정하였다면 Oracle은
자동적으로 64K extent들을 생성, 이용하게 된다. 만약 UNIFORM SIZE를 72K로
지정하였다면 128K(64K*2) extent들을 생성, 이용하게 된다.

LOCALLY MANAGED TABLESPACES
---------------------------
Locally managed tablespace는 자신이 보유, 관리하는 각 extent들에 대한
freed, used 여부를 bitmap형태로 각 구성 datafile들에 저장한다. Bitmap내의
각 bit들은 하나의 block 또는 block의 묶음에(extent) 대한 status를 표시한다.
만약 이들 extent들을 free하거나 할당받아서 사용하게 되면 각각의 extent에
해당하는 bitmap값들이 변경되게 된다. 이러한 변경사항들은 data dictionay
table들에 update작업을 수행하지 않는 관계로 rollback정보를 생성하지 않는다.
이렇게 local로 관리되는 경우 인접한 각 free extent들에 대한 정보가
자동적으로 추적가능하기 때문에 free extent를 coalesce할 필요성이 없어진다.
Locally managed tablespace는 동일한 size의 extent들을 가지도록 설정할 수도
있고, system이 알아서 그 extent의 size를 결정하도록 할 수도 있다.
Tablespace생성시의 UNIFORM 또는 AUTOALLOCATE option을 이용하여 이를
결정한다.
system tablespace는 locally managed tablespace로 생성할 수 없다.

사용 예제
---------
REM AUTOALLOCATE 는 해당 tablespace내의 extent size가 system에 의해서
REM 결정됨을 지정함.
REM 사용자가 extent의 size를 지정할 수 없다.
SQL> CREATE TABLESPACE local_auto DATAFILE
2 '/mnt3/rctest8i/server/local_auto.dbf' SIZE 1M
3 EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
Tablespace created.
SQL> CREATE TABLESPACE local_uniform DATAFILE
2 '/mnt3/rctest8i/server/local_u.dbf' SIZE 1M
3 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;
Tablespace created.
SQL> select TABLESPACE_NAME,
2 INITIAL_EXTENT,
3 NEXT_EXTENT,
4 MIN_EXTENTS,
5 MAX_EXTENTS,
6 MIN_EXTLEN,
7 EXTENT_MANAGEMENT,
8 ALLOCATION_TYPE
9 from dba_tablespaces
10 where tablespace_name like 'LOCAL%';
TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS
MIN_EXTLEN EXTENT_MAN ALLOCATION
--------------- -------------- ----------- ----------- ----------------
---------- ---------- ----------
LOCAL_AUTO 65,536 1 2,147,483,645
65,536 LOCAL SYSTEM
LOCAL_UNIFORM 131,072 131,072 1 2,147,483,645
131,072 LOCAL UNIFORM

각 tablespace에 table을 생성
SQL> CREATE TABLE local_table1 (
2 DEPTNO NUMBER(3) NOT NULL,
3 DNAME VARCHAR2(14),
4 LOC VARCHAR2(13))
5 storage (initial 10k next 10k)
6 tablespace local_uniform;
Table created.
SQL> CREATE TABLE local_table2 (
2 DEPTNO NUMBER(3) NOT NULL,
3 DNAME VARCHAR2(14),
4 LOC VARCHAR2(13))
5 storage (initial 10k next 10k)
6 tablespace local_auto;
Table created.

USER_TABLES에서 INITIAL과 NEXT를 확인
SQL> select table_name,
2 tablespace_name,
3 INITIAL_EXTENT,
4 NEXT_EXTENT
5 from user_tables
6 where table_name like 'LOCAL%';
TABLE_NAME TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT
------------------- --------------- -------------- ------------
LOCAL_TABLE1 LOCAL_UNIFORM 10,240 131,072
LOCAL_TABLE2 LOCAL_AUTO 10,240

각 table에 실제적으로 할당된 extent들의 size를 확인
SQL> select SEGMENT_NAME,
2 SEGMENT_TYPE,
3 TABLESPACE_NAME,
4 EXTENT_ID,
5 BYTES,
6 BLOCKS
7 from user_extents
8 where segment_name like 'LOCAL%';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS
--------------- ------------- --------------- --------- -------- ------
LOCAL_TABLE1 TABLE LOCAL_UNIFORM 0 131,072 64
LOCAL_TABLE2 TABLE LOCAL_AUTO 0 65,536 32

각 table에 하나 씩의 extent를 더 할당
SQL> alter table local_table1 allocate extent;
Table altered.
SQL> alter table local_table2 allocate extent;
Table altered.

SQL> select SEGMENT_NAME,
2 SEGMENT_TYPE,
3 TABLESPACE_NAME,
4 EXTENT_ID,
5 BYTES,
6 BLOCKS
7 from user_extents
8 where segment_name like 'LOCAL%';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS
--------------- ------------- --------------- --------- -------- ------
LOCAL_TABLE1 TABLE LOCAL_UNIFORM 0 131,072 64
LOCAL_TABLE1 TABLE LOCAL_UNIFORM 1 131,072 64
LOCAL_TABLE2 TABLE LOCAL_AUTO 0 65,536 32
LOCAL_TABLE2 TABLE LOCAL_AUTO 1 65,536 32

Locally Managed Tablespaces의 장점
----------------------------------
1. 다음과 같은 factor로 인해 space 관리 상 이점이 있음
- 동일한 size의 extent들
- data dictionary에 대한 access를 줄임
2. fragment를 줄일 수 있음.
3. temporary tablespace를 locally managed tablespace로 할 경우 관리 상의
이점이 있음.

 

반응형

+ Recent posts