본문 바로가기

카테고리 없음

ORACLE 9i CREATE TABLE – STORAGE CLAUSE v1.0

ORACLE 9i CREATE TABLE - STORAGE CLAUSE

 

from

 

1.  CREATE TABLE STORAGE CLAUSE

A.   DICTIONARY 방식의 TABLESPACE에 사용된다.

B.   SYSTEM에게 해당 TABLE의 관리방법을 지시하는 절이다.

C.   INITIAL, NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS 등이 있다.

D.   8i 에서 추가된 LOCAL 방식 덕분에 위의 파라미터는 무의미해 졌다.

( LOCAL 방식 사용시)

2.  TRUNCATE 시 변화

A.   사전에 DICTIONARY 방식의 TABLESPACE를 생성하였다.

(SYSTEM TABLESPACE LOCAL 인 경우 위의 작업이 불가하다.)

B.   MINEXTENTS 정의하지 않았을 때

1   create table del

  2    (id number)

  3    tablespace dic

  4    storage

  5    (initial 1m

  6    next 1m

7*   pctincrease 0)

(위에서 INITIAL, NEXT, PCTINCREASE 를 정의했다. INITIAL은 초기 사이즈 NEXT는 다음에 할당 받을 사이즈 PCTINCREASE NEXT 로 할당한 그 다음의 경우 증가할 사이즈 % 를 의미한다. 예로 초기생성시 이 테이블은 1M 이며 다음 익스텐트를 할당받으면 2M 가 되며 그 다음엔 3M가 된다는 이야기다. )

SQL> /

 

Table created.

 

SQL> select segment_name,tablespace_name,bytes,blocks,extents from user_segments;

 

SEGMENT_NAME    TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS

--------------- ------------------------------ ---------- ---------- ----------

DEL             DIC                               1064960        260          1

(생성한 테이블은 하나의 익스텐트를 가지고 있다는걸 알수 있다. bytes 값을 Megabytes로 바꿔보면 대략 1M가 나온다.)

SQL> begin

  2     for i in 1..100000 loop

  3             insert into del values(i);

  4     end loop;

  5  end;

  6  /

 

PL/SQL procedure successfully completed.

 

SQL> commit;

 

Commit complete.

 

SQL> select segment_name,tablespace_name,bytes,blocks,extents from user_segments;

 

SEGMENT_NAME    TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS

--------------- ------------------------------ ---------- ---------- ----------

DEL             DIC                               2129920        520          2

(데이터를 넣자 익스텐트가 하나 더 할당되었고 1M가 증가했음을 확인했다.)

SQL> truncate table del;

 

Table truncated.

( Truncate 는 할당되어있던 EXTENT를 빼앗을 수 있다. 다시 조회하자 초기 테이블을 생성했을 때와 동일한 상태가 되었다.)

SQL> select segment_name,tablespace_name,bytes,blocks,extents from user_segments;

 

SEGMENT_NAME    TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS

--------------- ------------------------------ ---------- ---------- ----------

DEL             DIC                               1064960        260          1

C.   MINEXTENTS 정의했을 때

"afiedt.buf" 9L, 104C written

 

  1  create table del

  2  (id number)

  3  tablespace dic

  4  storage (

  5  initial 1m

  6  next 1m

  7  pctincrease 0

  8* minextents 5)

SQL> /

(여기서는 MINEXTENTS 를 설정하였다. 이 값은 테이블 생성시 가져야 할 익스텐트 숫자를 의미한다. INITIAL 1M고 익스텐트 할당은 이후 쭈욱 1M이므로 ( PCTINCREASE 0 이므로 ) 생성시 5M의 크기를 가질 것이다.

Table created.

 

SQL> select segment_name,tablespace_name,bytes,blocks,extents from user_segments;

 

SEGMENT_NAME    TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS

--------------- ------------------------------ ---------- ---------- ----------

DEL             DIC                               5324800       1300          5

 

SQL> select 5324800/1024/1024 from dual;

 

5324800/1024/1024

-----------------

         5.078125

(대략 5M의 크기가 나왔다.

/*+ 생성시 의도한 크기에서 약간의 오차가 나는 것은 헤더정보와 같이 추가적으로 필요한 정보의 공간 때문으로 보인다확인요 */)

SQL> truncate table del;

 

Table truncated.

 

SQL> select segment_name,tablespace_name,bytes,blocks,extents from user_segments;

 

SEGMENT_NAME    TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS

--------------- ------------------------------ ---------- ---------- ----------

DEL             DIC                               5324800       1300          5

( 5개의 익스텐트를 가지고 있다. )

SQL> begin

  2     for i in 1..10000 loop

  3             insert into del values(i);

  4     end loop;

  5  end;

  6  /

 

PL/SQL procedure successfully completed.

 

SQL> commit;

 

Commit complete.

 

SQL> select segment_name,tablespace_name,bytes,blocks,extents from user_segments;

 

SEGMENT_NAME    TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS

--------------- ------------------------------ ---------- ---------- ----------

DEL             DIC                               5324800       1300          5

 

 

SQL> begin

  2     for i in 1..10 loop

  3             insert into del select * from del;

  4     end loop;

  5  end;

  6  /


SQL> select segment_name,tablespace_name,bytes,blocks,extents from user_segments;

 

 

SEGMENT_NAME    TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS

--------------- ------------------------------ ---------- ---------- ----------

DEL             DIC                               9584640       2340          9

( 익스텐트가 9개가 되었다. )

SQL> SQL> commit;

 

Commit complete.

 

SQL> truncate table del;

 

Table truncated.

 

SQL> select segment_name,tablespace_name,bytes,blocks,extents from user_segments;

 

SEGMENT_NAME    TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS

--------------- ------------------------------ ---------- ---------- ----------

DEL             DIC                               5324800       1300          5

 

( TRUNCATE 를 실행하자 생성 초기값으로 돌아갔다. 이 경우 MINEXTENTS 값까지 고려한 크기로 적용된다. )

 

/*+ EXTENT 가 할당되는 시기 ROLLBACK을 해도 할당된건 그대로인가? DELETE 해도 HWM가 내려가지 않는 것을 확인… */