2010년 9월 1일 수요일

[11g] SEGMENT 관리에 대해서


11gR2 의 신기능 SEGMENT 관리에 대해 알아 보겠습니다.


기존 버전에서는 TABLE 을 생성 하게 되면 DBA_SEGMENTS 딕셔너리에 등록이 됩니다.
그러나 11gR2 에서 부터는 TABLE 생성의 STORAGE 옵션 또는 파라미터설정에 따라
DBA_SEGMENTS 딕셔너리에 등록 여부를  정할 수 있습니다.
그렇다고 영원히 DBA_SEGMENTS 딕셔너리에 등록이 되지 않는것이 아니라
해당 테이블에 데이타가 INSERT 가 되면  그때 DBA_SEGMENTS 딕셔너리에 등록이 되면서 정보를 보실 수 있습니다.
그리고 그 해당 테이블을 재구성을 하지 않는 이상 DELETE , TRUNCATE 를 하더라도
DBA_SEGMENTS 딕셔너리에서 등록된 정보는  계속 남아 있습니다.

그리고 데이타가 없을 때는 세그먼트가 없으므로
exp (예전버전) 를 사용해서 테이블 Definition조차 받을 수 없고,
expdp 에서는 이 경우에도 Definition은 받을 수 있습니다.


DEFERRED_SEGMENT_CREATION 은 테이블 생성시에 세그먼트의 initial 익스텐트 때문에 테이블스페이스에서 공간을
차지하는 문제 때문에 세그먼트를 데이타가 생길 때 나중에 만들겠다는기능입니다.
즉 세그먼트가 안만들어져서 없기 때문에 당연히 뷰 에도 안보입니다.
즉, 오라클 Apps 같은 경우 사용하지 않는 테이블이 수만개가 되는데 익스텐트가 1M 단위라해도 수십GB가
낭비되는데 이런 것을 방지하기 위한 기능입니다.
즉, 일반적인 개발프로젝트에서는 데이타 없는 테이블은 안만들것이기 때문에 불필요한 기능입니다.


그러나 권고하기를 이 기능은 일반적으로 테이블이 많이 생성되지만 쓰지않은 것 또한 많은
패키지(ERP..)쪽에 권고하더군요.

일담 IN-HOUSE의 프로그램에서는 데이터가 없는 테이블은 거의 없기 때문에 공간의 절약효과는
미미 하고 , 수행중에 세그먼트가 추가되기 때문에 처음 수행지 좀 느려진다고 합니다.


첨부로 11gR2 Upgrade Workshop에서 정리된 시기능들이 있습니다.
참고하세요.
=======================================================================
DEFERRED_SEGMENT_CREATION
• Default: TRUE
• Values: TRUE
FALSE
Purpose:
Newly created table will just allocate segments when a row gets inserted
• Tablespace must be locally managed
• COMPATIBLE ≥ 11.2.0
• New behaviour - default in 11gR2
• Advantage:
• Save disk space when a high number of tables will be created but never
populated
• Application installation time is reduced
• Please note:
• Small performance penalty when the first row is inserted, because the new segment must be created at that time.


결론 그럼 난  DBA_SEGMENTS 의 정보에 무조건 남기고 싶다면..
어떻게 하느냐...

아래 두가지 설정을 선택 하시면 됩니다.

1. 파라미터 레벨 설정

deferred_segment_creation = TRUE       ### DBA_, USER_, and ALL_SEGMENTS data dictionary views 에 정보를 남기지 않는다.
deferred_segment_creation = FALSE      ### DBA_, USER_, and ALL_SEGMENTS data dictionary views 에 정보를 남긴다.

2. 테이블 생성 레벨 설정 

CREATE TABLE A(ID NUMBER);

SELECT * FROM DBA_SEGMENTS WHERE SEGMENT_NAME='A';
  -- deferred_segment_creation =TRUE 가 DEFAULT 값이므로 안 보입니다.



CREATE TABLE A_1(ID NUMBER) SEGMENT CREATION IMMEDIATE;
SELECT * FROM DBA_SEGMENTS WHERE SEGMENT_NAME='A_1';
   -- deferred_segment_creation =TRUE 가 DEFAULT 값이지만 SEGMENT CREATION IMMEDIATE 이므로 정보가 보이겠네요.

팔로어