[Oracle] deferred 세그먼트 생성

·2025년 9월 17일
0

오라클 관리

목록 보기
154/163

💡 deferred 테이블이란?

보통 테이블 생성 스크립트로 테이블을 생성하면 바로 기본 공간을 할당 받음
--> extent가 생성됨. 그런데 수백 개의 테이블을 생성해야하는데 지금 당장 공간이 넉넉치 않으면 deferred 테이블을 생성하면 됨.
--> 이 테이블을 insert가 시작될 때 extent가 할당됨


💡 deferred 테이블의 종류 2가지

  테이블 생성시 deferred  세그먼트로 생성할 수 있습니다.

  1. segment  creation  immediate

     테이블을 생성하자 마자 바로 세그 먼트를 할당 

  2. segment  creation  deferred

     테이블을 생성하자 마자 바로 세그먼트를 할당 하지 않고 insert 할 때 할당

 수백개의 테이블을 갑자기 동시에 생성해야하는 작업을 할 때 에러없이 
 수월하게 수행되게하는 기술입니다.

[실습] deferred 세그먼트 생성 실습

--#1.  segment  creation  immediate 옵션으로 테이블 생성

 create  table  emp700
  (  empno   number(10),
    ename    varchar2(500) )
   segment  creation  immediate   tablespace  users;

--#2.  공간이 할당되었는지 확인

select table_name 
 from user_tables
 where table_name='EMP700';
 
select  segment_name, extents, blocks
from  user_segments
where  segment_name='EMP700';

--세그먼트가 생성되어서 바로 보입니다.

--#3.  segment creation  deferred 옵션으로 테이블 생성

 create  table  emp800
  (  empno   number(10),
    ename    varchar2(500) )
   segment  creation  deferred   tablespace  users;

--#4.  공간이 할당 되었는지 확인 

select table_name 
 from user_tables
 where table_name='EMP800';

select  segment_name, extents, blocks
from  user_segments
where  segment_name='EMP800';
 
--#5. emp800 테이블에 데이터를 입력해보고 공간이 할당 되었는지 확인합니다.

insert  into  emp800  values( 1111, 'aaaa');
commit;

select  segment_name, extents, blocks
from  user_segments
where  segment_name='EMP800';

문제1. emp 테이블에 sal에 인덱스를 생성하시오

create index emp_sal 
 on emp(sal);
 
select  segment_name, extents, blocks
from  user_segments
where  segment_name='EMP_SAL';

문제2. emp 테이블에 job에 인덱스를 생성할 때 segment creation deferred tablespace users 옵션을 붙여서 생성할 수 있는지 확인하시오

create index emp_job
 on emp(job)
segment creation deferred tablespace users;

에러나면서 생성안됨. 인덱스 생성 시에는 사용할 수 없음. 테이블만 가능

[정리1] 오라클에서 저장공간을 절약하기 위한 기술 3가지

  1. db reorg 작업
  2. 테이블 압축
  3. segment creation deferred

0개의 댓글