ORACLE 9i EXTENT MANAGEMENT DICTIONARY
from OTN storage clause
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/clauses009.htm#i997317
1. EXTENT MANAGEMENT DICTIONARY
A.
EXTENT 할당에 있어 SYSTEM 에서 중앙통제하는 방식이다.
B.
SYSTEM 이 LOCAL 방식이면 일반 TBS 는 LOCAL 방식밖에 사용 못한다
C.
SYSTEM 이 DICTIONARY 방식이면 일반 TBS 는 LOCAL / DICTIONARY 무엇이든
사용가능하다.
2. DICTIONARY TABLESPACE 에 대한 질문과 해답
A. DICTIONARY 할당 방식에서 TRUNCATE 시 할당된 익스텐트의 해제가 어디까지
이루어지는지
확인, MINEXTENTS, INITEXTENTS 두 개의 파라미터 중 어느 값의 영향을 받는지 확인
SQL> select tablespace_name, extent_management from
dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN
------------------------------ ----------
SYSTEM DICTIONARY
TEMP LOCAL
UNDO LOCAL
USERS LOCAL
EXAMPLE LOCAL
DIC DICTIONARY
TB1 LOCAL
TB2 LOCAL
TB3 LOCAL
TB4 LOCAL
MANY LOCAL
11 rows selected.
SYSTEM TABLESPACE 가 DICTIONARY 방식임을 확인
SQL> select username,default_tablespace from
dba_users;
USERNAME DEFAULT_TABLESPACE
------------------------------
------------------------------
SYS SYSTEM
SYSTEM SYSTEM
OUTLN SYSTEM
TEMP USERS
SAMP EXAMPLE
DBSNMP SYSTEM
HR EXAMPLE
ORACLE_ADMIN SYSTEM
HR_AUDIT USERS
USERNAME DEFAULT_TABLESPACE
------------------------------
------------------------------
DIC
DIC
IDX USERS
SCOTT EXAMPLE
U1 USERS
U2 USERS
LOG USERS
LOGVIEWER USERS
DROP1 SYSTEM
17 rows selected.
기존에 DICTIONARY 방식으로 TABLESPACE를 이용하는 USER를 찾았고 여기서는 DIC USER를
사용하기로
하였다.
SQL> create table drop_this
2 (id number)
3 storage(
4 initial 500k
5 next 100k
6 minextents 4);
Table created.
DIC USER 로 최소 EXTENT가 4인
drop_this 테이블을 만들었다.
SEGMENT_NAME BYTES BLOCKS
EXTENTS
-------------------- ---------- ---------- ----------
DEL
1064960 260 1
DROP_THIS
1024000 250 4
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
위 view 는 dba_segments 를 조회한 결과이다. 아까 만든 DROP_THIS 의 내용을 보면
하나의
익스텐트당 250 Kbyte 임을 알 수 있다.블록은 250개이고 해당 tbs의 블록사이즈는 4K 이다. 두개를 곱하면 (250
* 4096 ) => 1024000 byte 가 나온다.
아래는 tablespace 의 block size를 확인한 결과이다.
SQL> select tablespace_name,block_size from
dba_tablespaces;
TABLESPACE_NAME
BLOCK_SIZE
------------------------------ ----------
SYSTEM 4096
TEMP 4096
UNDO 4096
USERS 4096
EXAMPLE 4096
DIC 4096
TB1 4096
TB2 4096
TB3 4096
TB4 4096
MANY 4096
11 rows selected.
DIC TABLESPACE 의 BLOCK SIZE를 확인한 부분이다.
SQL> alter table drop_this allocate extent (size
8k);
Table altered.
익스텐트를
수동으로 할당하였다.
SQL> select segment_name,bytes,blocks,extents
2 from user_segments;
SEGMENT_NAME
BYTES BLOCKS
EXTENTS
-------------------- ---------- ---------- ----------
DEL
1064960 260 1
DROP_THIS
1032192 252 5
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
6 rows selected.
8k extent 를 할당하고 확인한
결과이다. extent 수가 하나 증가했음을 알 수 있다. 또
이 extent는 8K 이다. 기본블록이 4K 이므로 블록은 2개가
증가하였고 bytes는 4096 * 2 만큼 증가했다.
SQL> select 1032192-8192 from dual;
1032192-8192
------------
1024000
SQL> truncate table drop_this;
Table truncated.
truncate를 사용하였다. truncate 명령어는 extent deallocation 효과가
있다.
실행결과
할당되었던 extent 는 해제되고 초기 사이즈로 돌아왔다.
SQL> select segment_name,bytes,blocks,extents
2 from user_segments;
SEGMENT_NAME BYTES BLOCKS
EXTENTS
-------------------- ---------- ---------- ----------
DEL
1064960 260 1
DROP_THIS
1024000 250 4
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
6 rows selected.
다음에는 extent를 하나씩 자동할당(사이즈 지정 않고…)해보도록 하겠다.
첫번째 extent 를 할당하였다.
SQL> alter table drop_this allocate extent;
Table altered.
SQL> select segment_name,bytes,blocks,extents from
user_segments;
SEGMENT_NAME BYTES BLOCKS
EXTENTS
-------------------- ---------- ---------- ----------
DEL
1064960 260 1
DROP_THIS
1032192 252 5
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
6 rows selected.
두번째 extent를 할당하였다.
SQL> alter table drop_this allocate extent;
Table altered.
SQL> select segment_name,bytes,blocks,extents from
user_segments;
SEGMENT_NAME BYTES BLOCKS
EXTENTS
-------------------- ---------- ---------- ----------
DEL
1064960 260 1
DROP_THIS
1044480 255 6
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
6 rows selected.
SQL> select 1044480-1032192 from dual;
1044480-1032192
---------------
12288
SQL> select 12288/3 from dual;
12288/3
----------
4096
세번째 extent를 할당하였다.
SQL> alter table drop_this allocate extent;
Table altered.
SQL> select segment_name,bytes,blocks,extents from
user_segments;
SEGMENT_NAME BYTES BLOCKS
EXTENTS
-------------------- ---------- ---------- ----------
DEL
1064960 260 1
DROP_THIS
1064960 260 7
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
ADDRESS 65536 16 1
6 rows selected.
SQL> select 1064960-1044480 from dual;
1064960-1044480
---------------
20480
첫번째 ~ 세번째 extent 할당을 하면서 변화량을 정리하면
extent 크기 위 extent 값과의 차이
1 8192(8k)
2 12288(12k) 4096(4k)
3 20480(20k) 8192(8k)
위와 같다.
추가로
네번째를 할당하면
4 40960(40k) 20480(20k)
해당 익스텐트들이
정말 위와같이 크기를 가지고 있는지 dba_extents 에서
확인 해
보겠다.
SQL> 1 select segment_name,extent_id,bytes/1024
SQL> 2 from user_extents
SQL> 3 where segment_name = 'DROP_THIS'
SQL> 4*
order by 2 asc
SQL> /
SEGMENT_NAME
EXTENT_ID BYTES/1024
-------------------- ---------- ----------
DROP_THIS 0 500
DROP_THIS 1 100
DROP_THIS 2 160
DROP_THIS 3 240
DROP_THIS 4 8
DROP_THIS 5 12
DROP_THIS 6 20
DROP_THIS 7 40
8 rows selected.
위에서
계산한 대로의 크기가 나왔다. initial 과 next 사이즈도
각각 500, 100 으로 할당된 걸 볼 수 있었다.
/*+ 여기서 의문은 EXTENT_ID 2,3 의 사이즈는 어디서 정의된 값인지 그리고 4~7번은 EXTENT를 자동사이즈로 수동 할당하였는데 PCTINCREASE 값의
영향을 받은건지 불분명하단 것이다. PCTINCREASE 값은 딕셔너리 조회 결과 50으로 확인하였다. 추후 추가조사가 필요할 듯…*/