ORACLE SEGMENT TYPE v1.0
ORACLE 10g SEGMENT TYPE
from Segment In Oracle | http://www.adp-gmbh.ch/ora/concepts/segments.html
from Oracle Nested Tables | http://psoug.org/reference/nested_tab.html
1. ORCLE SEGMENT TYPE
ORACLE 의 Segment 에 대해 다음과 같이 이야기 한다.
데이터의 기본적인 저장소는 블록이며 이 블록은 익스텐트의 구성요소이다.
또 익스텐트가 모여 세그먼트를 구성한다.
세그먼트는 인덱스가 될 수도 있고 테이블이 될 수도 있다.
세그먼트가 성장하면 저장소가 부족할 수 있는데 이 때 익스텐트를 할당받는다.
때문에 익스텐트를 할당단위라고 한다.
2. (DBA|ALL|USER)_SEGMENTS
위와 같은 Dictionary 로 Segment 의 정보를 조회할 수 있다.
SQL> select segment_type
2 from dba_segments
3 group by segment_type;
SEGMENT_TYPE
------------------
LOBINDEX
INDEX PARTITION
NESTED TABLE
TABLE PARTITION
ROLLBACK
LOB PARTITION
LOBSEGMENT
TABLE
INDEX
CLUSTER
TYPE2 UNDO
위와 같은 세그먼트 종류가 있으며 위의 세그먼트를 대분류하면 아래와 같다.
data segment : tale and cluster
index
rollback
temporary data
위 분류는 ‘Segment In Oracle’ 를 참조하였다.
index 도 Index Column 에 대해 Value 를 온전히 가지는 것을 생각하면 – Table Random Access 없는 Index Scan 을 생각 – data segment 에 들어갈 법하다.
Dictionay 내에는 위 분류를 크게 포괄하는 분류가 별도로 없다.
3. SEGMENT TYPE
A. LOB SEGMENT / LOB PARTITION / LOBINDEX
/*+ LOBINDEX, LOB PARTITION 정보추가 */
LOB SEGMENT 확인하기 위한 예제이다.
SQL> create table lob_1
2 (id number,
3 data clob)
4 lob (data) store as lob_1_lob(tablespace users chunk 8192
5 nocache logging
6 storage (maxextents 5)
7 );
Table created.
CLOB 을 컬럼으로 가지는 테이블을 생성했다.
SQL> /
SEGMENT_NAME SEGMENT_TYPE
-------------------- ------------------
LOBCOMPPART$ TABLE
LOBFRAG$ TABLE
LOB_1 TABLE
LOB_1_LOB LOBSEGMENT
생성구문을 보면 CLOB Column 에 대해 naming 을 했고 해당하는 이름은 lob_1_lob 이다. 이 이름을 위에서 확인할 수 있다.
SQL> create index lob_ix01 on lob_1(id);
Index created.
SQL> @lob
SEGMENT_NAME SEGMENT_TYPE
-------------------- ------------------
LOBCOMPPART$ TABLE
LOBFRAG$ TABLE
LOB_1 TABLE
LOB_1_LOB LOBSEGMENT
LOB_IX01 INDEX
SQL> create index lobb_ix02 on lob_1(id,data);
create index lobb_ix02 on lob_1(id,data)
*
ERROR at line 1:
ORA-02327: cannot create index on expression with datatype LOB
SQL> create index lob_ix02 on lob_1(data);
create index lob_ix02 on lob_1(data)
*
ERROR at line 1:
ORA-02327: cannot create index on expression with datatype LOB
위의 과정은 LOB Data 에 대해 Index 구성 컬럼으로 사용하지 못한다는 것을 보여준 예시이다. –라기보다 LOB INDEX 가 무엇인지 테스트하던 과정이였다. -
B. INDEX / INDEX PARTITION
INDEX 에 대한 설명은 생략한다.
INDEX PARTITION 에는 Global Partitioned Index 와 Local Partitioned Index 가 있다. 구분의 기준은 Partition Key Column 과 동일하게 나눠진 여부로 판단한다.
/*+ 생성해보고 서브타입확인 */
C. TABLE / TABLE PARTITION
Table 에 대한 설명은 생략한다.
Partitioned Table 은 세그먼트가 분할된 테이블을 말한다. 분할에 사용되는 정보입력은 Value 이며 이는 Hash / Range / List 등으로 나뉘어진다.
D. NESTED TABLE
간단히 이야기 해 Table 구조 안에 또다른 Table 구조를 볼 수 있는 경우이다.
SQL> create or replace type nested_table as table of number;
2 /
Type created.
SQL> create table id(
2 id1 number,
3 id2 nested_table)
4 nested table id2 store as id2_table;
Table created.
SQL> desc id
Name Null? Type
----------------------------------------- -------- ----------------------------
ID1 NUMBER
ID2 NESTED_TABLE
SQL> insert into id
2 values(1,nested_table(2,3,4,5));
1 row created.
SQL> select * from id;
ID1 ID2
---------- ----------------------------------------
1 NESTED_TABLE(2, 3, 4, 5)
E. ROLLBACK
8i 의 Rollback Segment 를 말한다. 9i 의 Undo Table Space 는 TYPE2 UNDO 에 속한다.
F. CLUSTER
Partitiioned Table 이 나오기 전 조인에 대해 Clustering Factor 를 높이기 위한 방안이었다.
G. TYPE2 UNDO
TYPE2 UNDO 는 UNDO Segment 이다. 이는 DBA_SEGMENTS.TABLESPACE_NAME 을 보면 알 수 있다.
SQL> ed
Wrote file afiedt.buf
1 SELECT SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME
2 FROM DBA_SEGMENTS
3* WHERE SEGMENT_TYPE = 'TYPE2 UNDO'
SQL> /
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
-------------------- ------------------ ------------------------------
_SYSSMU1_1660423497$ TYPE2 UNDO UNDOTBS1
_SYSSMU2_3372729673$ TYPE2 UNDO UNDOTBS1
_SYSSMU3_2464759297$ TYPE2 UNDO UNDOTBS1
_SYSSMU4_2381026098$ TYPE2 UNDO UNDOTBS1
_SYSSMU5_684390363$ TYPE2 UNDO UNDOTBS1
_SYSSMU6_2756300678$ TYPE2 UNDO UNDOTBS1
_SYSSMU7_34240122$ TYPE2 UNDO UNDOTBS1
_SYSSMU8_2965297914$ TYPE2 UNDO UNDOTBS1
_SYSSMU9_783869137$ TYPE2 UNDO UNDOTBS1
_SYSSMU10_1385731836 TYPE2 UNDO UNDOTBS1
$
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
-------------------- ------------------ ------------------------------
10 rows selected.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1