본문 바로가기

카테고리 없음

ORACLE 9i EXTENT MANAGEMENT DICTIONARY v1.0

ORACLE 9i EXTENT MANAGEMENT DICTIONARY

 

 

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으로 확인하였다. 추후 추가조사가 필요할 듯…*/