■■■ Develop ■■■/[ Database ]

[ DB ] - 오라클 인덱스 종류

시드라엘 2013. 7. 10. 11:14

* B*TREE Index

 - Search, Delete, Insert 등에 효율적

 - 어느 Row등 동일 Index를 Scan하여 찾는다고 하면 같은 개수의 Block을 찾아올 수 있는 구조

 - Double Linked List를 이용하여 Range Scan 시에도 유리

 - Delete가 많거나 또는 Index Key가 순차적으로 증가하여 Insert되는 Table은

   주기적인 Index Rebuild를 통한 Index Balance 유지가 필요

 

## 장점

 1. Search 시 모든 Index Entry에 대해 Balance를 맞춤

 2. Range Scan 시 Double Linked List를 사용하기 때문에 유리

 3. OLTP로 적은 Row Access 유리

 

## 단점

 1. Cardinality가 낮은 컬럼에 대해서는 불리

 2. OR 연산자에 대해 Table Full Scan 위험 (오라클 옵티마이저 경향) => IN 연산자로 변경하여 사용

 

* 비트맵 Index

 - Yes or No인 값에 대하여 하나의 인덱스 엔트리에 여러개의 행정보가 들어감

 - OLTP 부적합

 - ad-hoc 으로 많은 열을 참고하는 질의나 COUNT 같은 집계를 하는 질의가 많은 경우 유용

 

* 함수 기반(function-based) Index - 8.1.5 이상

 - 대소문자 구별이 없는 탐색이나 정렬, 또는 복잡한 수식에 대한 탐색 등을 사용시 유용

 - 기존 애플리케이션의 로직이나 질의를 전혀 바꾸지 않고도 수행 속도를 개선

 - Cost based optimizer를 사용할때만 사용. rule based optimizer에서는 사용되지 않음.

 - Data Insert시 느려짐

 - TO_DATE 불가

 

* 애플리케이션 도메인 Index

 - 데이터베이스에는 아직 없는 새로운 인덱스 유형을 만들 수 있도록 해줌

 - ex) 인터미디어(interMedia) 텍스트 인덱스

 

Cluster Factor (인덱스의 값을 기반으로 테이블의 행들이 순서대로 되어 있는 정도)

1. 데이터 조회시 인덱스를 통해 데이터 RowId 조회후 해당 Table Block을 조회하게 되는데

  이 둘의 관계를 Cluster Factory라고 함. 조회할 데이터들이 같은 공간에 잘 정리되었는지 여부.

 ex) 1인 경우 = 100 Row 추출시 100 Block 조회 (Cluster Factor가 불량)

       0에 근접한 경우 (Table에 Row Chaining 현상 - 하나의 Row가 2개의 Block에 저장)

 

값이 블록의 개수에 가까우면 테이블이 매우 잘 정렬되어 있다는 의미

값이 행의 개수에 가까우면 테이블이 매우 임의적인 순서로 있다는 의미

 

2. 최적화 방법

 - 주기적인 Table 재구성(Order By 이용)

 - Partition Table

 - Cluster Table (DML 성능 저하로 거의 미사용)

 - Index-Organized Table(IOT)

 

3. 주기적인 Table 재구성 사례

 1. 임시 테이블로 정렬하여 Loading (기존 테이블과 TableSpace 동일해야 함)

 2. 서비스 정지

 3. 기존 테이블과 임시 테이블을 Switch

(ALTER TABLE_NAME EXCHANGE PARTITION 200403

  WITH TABLE 200403_TEMP INCLUDING INDEXES; )