정미나닷컴

[Oracle] 오라클 IOT, Index-Organized Table, 클러스터 테이블 본문

IT

[Oracle] 오라클 IOT, Index-Organized Table, 클러스터 테이블

정미나 2017. 9. 27. 23:03

IOT (Index-Organized Table)

- Table Random Access가 발생하지 않도록 처음부터 인덱스 구조로 생성된 테이블

- Index leaf block = data block (모든 행 데이터를 리프 블록에 저장)

- 정렬상태를 유지하며 데이터를 삽입(PK 컬럼 순)

CREATE TABLE INDEX_ORG_T ( 

A NUMBER PRIMARY KEY, 

B VARCHAR(10) 

)

ORGANIZATION INDEX;

-- 일반적으로 사용되는 테이블은 '힙 구조 테이블'로 ORGANIZATION HEAP; 이 생략되어 있는 것


장점

- 클러스터링 팩터가 좋음

- Random이 아닌 Sequential Access 방식이므로 넓은 범위 access 시 유리

- PK 인덱스를 위한 별도의 세그먼트 생성 불필요


단점

- DML 시 인덱스 분할로 인한 부하 발생 (PK 이외의 컬럼수가 많을수록 성능 저하)

- Direct Path Insert 불가


IOT의 활용

- 크기가 작고 NL JOIN으로 반복 Lookup하는 테이블 (ex: 공통 Code 테이블)

- 폭이 좁고 긴(=로우 수가 많은) 테이블

- 넓은 범위를 주로 검색하는 테이블 (주로 Between, Like 같은 조건으로 검색, 통계성 테이블)

- 데이터 입력과 조회 패턴이 서로 다른 테이블 (ex: 입력은 일자별, 조회는 사원별)




Partitioned IOT

- 넓은 범위의 거래일자를 기준으로 특정 상품을 조회하는 쿼리가 자주 수행되는 테이블

- 거래일자 기준 Range 파티셔닝

- [상품번호 + 거래일자] 순으로 PK를 정의하고, IOT 구성


Secondary 인덱스

* IOT는 secondary 인덱스 추가 가능성이 크지 않을 때만 선택하는 것이 바람직


① physical guess를 통해 IOT 레코드 access

② PK를 통해 IOT 레코드 access

- 상황에 따라 다른 방식으로 IOT access

- IOT 레코드의 위치는 영구적이지 않기 때문에 secondary index가 IOT 레코드를 가리킬 때 물리적 주소 대신 Logical RowID  사용

- Logical RowID = PK + physical guess

( physical guess: secondary 인덱스를 최초 생성하거나 재생성한 시점에 IOT 레코드가 위치했던 DBA, 갱신X )


인덱스 클러스터 테이블

- 클러스터 키 값이 같은 레코드들을 한 블록에 모이도록 저장 (넘치면 새 블록 & 클러스터 체인 연결)

- 물리적으로 같은 블록에 여러 테이블의 레코드 저장 가능 (서로 Join된 상태로 저장->다중 테이블 인덱스 클러스터)

- 클러스터 인덱스는 해당 키 값을 저장하는 첫 데이터 블록만 가리킴

- Key : Record = 1 : M

- 클러스터링 팩터가 매우 좋음