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가 내려가지 않는 것을 확인… */