본문 바로가기
OraclE

TABLESPACE, SEGMENT, EXTENT [펌]

by 타마마임팩트_쫀 2010. 3. 4.

[출처] http://blog.naver.com/ace2805?Redirect=Log&logNo=70074627223


각 구성 요소의 확인

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

select * from dba_tablespaces;

select * from dba_data_files;

select * from dba_temp_files;                    

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

 

create tablespace ik_ts

datafile '/home/oracle/oradata/orcl/ik_ts01.dbf' size 10m autoextend on next 10m maxsize 2g,

           '/home/oracle/oradata/orcl/ik_ts02.dbf' size 20m;

으로 tablespace를 생성 하자.

 

SCOTT> create table t1(no number);     -->  일반적인 table 생성 명령어는 default tablespace에 생성 된다.

SCOTT> create table t1(no number)

             tablespace ik_ts;                   --> ik_ts01.dbf , ik_ts02.dbf  파일은 2개로 구성되어 있지만 두 파일을 합친것이

                                                              ik_ts tablespace 한개가 되는것이며.  어느쪽의 datafile 에 넣을지는 오라클이 결정한다.

   ===  현제 ik_ts tablespace의 상태이다. ===

현제 ik_ts는 2개의 datafile로 이루어진 tablespace로써 만들어진 segment 는 0개  extent 는 2개가 된다.

datafile 과 extent 의 관계가 1:1 이 될수 있는 이유는 위와 같이 각각의 file이 있고 file Header 이외의 연속된 공간이

1개인 상태의 extent 의 상태가 datafile 과 extent의 관계가 1:1의 관계가 되는 상태가 된다.

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

2> 여기서 table g 를 생성 하게 될 경우 8개의 블럭으로 구성된 1개의 extent를 할당 받게 된다.

create table g tablespace ik_ts as select * from emp;    --> segment 는 1개 (table g) 가 된다.  extent는 3개 가 된다.

ik_ts01.dbf 데이터 파일에 table g가 생성됨으로써 datafile 과 extent 의 관계가 1:1이 아니게 된다.

 

 

데이터의 양이 늘어 기본할당된 8개의 블럭이 모두 사용되면 추가로 8개의 블럭으로 구성된 extent 를 추가로 할당하게 된다.

segment 는 1개 (table g)  , extent 는 4개 가 된다.

 

순서는 다음과 같다

블럭 Header -> extent1(g) -> extent2(g의 추가할당) -> 이때 또 다른 table Z를 생성할 경우 8개의 블럭으로 된 1개의 extent(Z)가

할당되게 된다.

 

그후에 table g 의 데이터 양이 늘어나 추가 extent의 할당이 필요하게 될경우 다음과 같은 순서가 된다.

블럭 Header -> extent1(g) -> extent2(g의 추가할당) -> extent3(Z) -> extent4(g) 로 되며

이때 segment 는 g , z  2개가 되며   extent 는 6개가 된다.

 

select * from dba_segments where owner = 'SYS' and segment_name = 'G';     --> segment ( g ) 에 대한 정보

select * from dba_extents where owner = 'SH' and segment_name = 'G';          -->  사용한 extents 의 정보