제 2판

저자 : 토마스 카이트

저서 : 

옮김 : 오선경, 한준희, 유동오, 임영섭, 김창배

펴낸 곳: 제이펍

초판 : 

2판 2쇄 : 2011년 12월 16일 

 

 

 

CHAPTER 11. 인덱스

 

- 애플리케이션 개발 단계 중 인덱스가 가장 나중에 설꼐되는 것을 자주 볼 수 있는데, 이것은 잘못된 접근방법이라고 생각한다. 

 

- 개발 초기부터 데이터를어떻게 사용할지 이해하고 있다면, 애플리케이션에서 사용될 인덱스를 미리 생성할 수 있어야 한다.

 

- 개발 초기에 언제 어떻게 인덱스를 설계해야 하는지를 고려한다면, 향후 튜닝에 소비되는 많은 시간을 절약하게 될 것이다.

 

- 이 장의 주요 목적

 1) 인덱스를 전반적으로 살펴본다.

 2) 언제, 어디서 인덱스를 사용할 것인가를 살펴본다.

 

- 개발자는 인덱스를 잘 알고 있어야 하며, 애플리케이션에 어떠한 영향을 줄 것인지, 언제 사용되는지, 어떤 때에 사용하면 안 되는지 등에 대한 것을 잘 알아야 한다.

- DBA는 인덱스 크기의 증가, 인덱스 저장공간의 활용방법, 그리고 다른 물리적 요소를 고려해야 한다.

 

오라클 인덱스 개요 552

- 오라클의 다양한 인덱스 유형

 1) B*Tree 인덱스 : 보편적으로 언급되는 인덱스, 가장 자주 사용되는 일반적인 인덱스

  : 인덱스 구조 테이블

  : B*Tree 클러스터 인덱스

  : 내림차순 인덱스

  : 리버스 키 인덱스

 2) 비트맵 인덱스

 3) 비트맵 조인 인덱스

 

 4) 함수 기반 인덱스

  : 컬럼값 자체가 아니라 컬럼에 대한 함수의 계산된 결과가 저장되는 B*Tree 또는 비트맵 인덱스를 말한다.

  : 물리적으로 저장되는 컬럼이 아니라 가상컬럼(또는 파생 컬럼)의 인덱스라고 생각할 수 있다.

  : 미리 계산되어 인덱스로 저장 -> 쿼리의 수행을 향상

 

 5) 어플리케이션 도메인 인덱스

  : 오라클 내부 또는 외부에서 사용자가 만들어서 저장하는 인덱스

  : 사용자가 옵티마이저에 지정(사용 인덱스 선택, 실행비용 지정)

  : 옵티마이저가 인덱스 사용여부를 결정(위 정보를 이용)

  : 생성된 인덱스는 일반적인 인덱스 구조를 사용할 필요가 없다는 것을 기억해야 한다.

 

 

B*Tree 인덱스 554

- 데이터베이스에서 가장 일반적으로 사용되는 인덱스 구조

- 바이너리 검색 트리와 유사하게 수행

- 인덱스의 목표 : 오라클이 데이터를 검색할 때 수행 속도를 최소화하는 것

- 리프 노드(leaf node) or 리프 블록(leaf block) : 트리의 최하위 레벨 블록

  : 모든 인덱스 키와 인덱싱되는 로우를 가리키는 rowid를 포함

- 브랜치 블록(branch block) : 리프노드 위의 블록, 인덱스 구조를 이동하는 데 사용

- 인덱스 범위 스캔 : 리프 노드에서 싲가점을 찾은 다음에는 값의 정렬된 순서로 읽어나가기만 하면 된다.

  : 더이상 인덱스 구조를 이동할 필요가 없고, 필요한 리프 노드를 통해 앞으로 뒤로 이동하면 된다.

  : 인덱스 리프 노드는 실제로 양 방향 linked list이다.

- B*Tree 특성 : 모든 리프 블록이 트리 안에서 모두 동일한 레벨에 존재 한다.

  : 동일한 레벨(인덱스의 높이) - 어떠한 조건이라도 루트 블록부터 리프 블록까지는 동일한 숫자의 블록을 방문한다.

  : 인덱스의 높이가 균현적이다

 

1) 인덱스 키 압축

2) 리버스 키 인덱스

3) 내림차순 인덱스

4) 언제 B*Tree 인덱스를 사용해야 하는가?

 

 

비트맵 인덱스 583

 

 

함수 기반 인덱스 593

- 함수 기반 인덱스 : 계산된 컬럼에 인덱스를 생성하여 쿼리에서 이 인덱스를 사용하는 것

- 함수 기반 인덱스를 사용해야 하는 이유

 : 구현하기 쉬울 뿐만 아니라 효과를 즉시 알 수 있다.

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

 

 

 

 

 

 

 

 

 

 

+ Recent posts