시작말

  • 너무 많은 인덱스는 수정(INSERT, UPDATE, MERGE DELETE) 성능을 떨어뜨리고, 너무 적은 인덱스도 DML 의 성능 (SELECT 를 포함하는 INSERT, UPDATE, DELETE)에 영향을 준다. 적절한 수준의 인덱스 설계는 애플리케이션의 성능에 있어서 매우 중요한 문제다.
  • 개발 초기부터 데이터를 어떻게 사용할지 이해하고 있다면, 애플리케이션에서사용될 인덱스를 미리 생성할 수 있어야 한다.
  • 대부분 애플리케이션을 완성하여 배포한 후에 인덱스가 필요한가를 검토하게 되는데 이것은 데이터가 어떻게 사용되는지 얼마나 많은 로우가 다루어질지 이해하는 시간을 갖지 못했다는 것을 의미한다. 시간이 지나면서 데이터가 증가해야만 이에 대응하기 위해 인덱스를 추가하여 튜닝하게 될 것이다.
  • 개발초기에 언제 어떻게 인덱스를 설계해야 하는지를 고려한다면 향후 튜닝에 소비되는 많은 시간을 절약하게 될 것이다.


오라클 인덱스 개요

1. B*Tree 인덱스
  • 이것은 보펀적으로 언급되는 인덱스며 지금까지 오라클과 다른 데이터베이스에 서 가장 자주 사용되는 일반적인 인덱스다.
  • 이진 트리와 유사한 구조인 B*tree 인덱스는 키 값을 이용해서 개별적인 로우 또는 로우의 특정 범위를 빠르게 접근할 수 있도록 해주며,몇 번의 읽는과정만으로 정확한 로우를 찾도록 해준다.


인덱스 구조 테이블 (IOT, index organized table)
  • B*Tree 구조로 저장되는 테이블이다.


B*Tree 클러스터 인덱스 (B*Tree cluster index)
  • 일반적인 B*Tree 인덱스를 약간 변형시킨 인덱스다.
  • 클러스터 키를 인덱싱하는 하는 것으로 10장 '인덱스 클러스터 테이블' 절에서 언급하였기 때문에 이 장에서는 다시 다루지 않을 것이다,


내림차순 인덱스 (descending index)
  • 일반적인 인덱스는 작은 값부터 큰 값으로 오름차순으로 정렬되는 반면, 내림차순 인덱 스는 큰 값부터 작은 값으로 내림차순으로 정렬된 데이터를 위한 인덱스다.


리버스 키 인덱스 (reverse key index)
  • 키 값을 뒤에서부터 역순으로 뒤집은 B*Tree 인덱스다. 계속 증가하는 값에 대한 인덱스를 고르게 분산하기 위한 인덱스다


2. 비트맵 인덱스 (bilmap index)
  • 일반적인 B*Tree 인덱스는 인덱스 엔트리와 테이블 로우가 일대일 관계로 구성되는 것으로, 각 인덱스 엔트리는 하나의 로우를 가리킨다. 이에 비해 비트맵 인덱스는 하나의 인덱스 엔트리가 동시에 다수의 로우를 가리키는 비트맵으로 구성된다.


비트업 조인 인텍스 (bilmap join index)
  • 이 인텍스는 테이블 속성의 반정규화를 대신하여 인덱스 구조를 통해 반정규화하는 것과 같은 결과를 제공한다


함수 기반 인덱스
  • 컬럼값 자체가 아니라 컬럼에 대한 함수의 계산된 결과를 저장되는 B*Tree 또는 비트맵 인덱스를 말한다. 즉 물리적으로 저장되는 컬럼이 아니라 가상 컬럼 (또는 파생 컬럼)의 인덱스라고 생각할 수 있다.


애플리케이션 도메인 인덱스 (applicalion domain index)
  • 오라클 내부 또는 외부에서 사용자가 만들어서 저장하는 인덱스다.