테이블에서 데이터를 찾는 두 가지 방법

1. 테이블 전체를 스캔

2. 인덱스를 이용 : 인덱스는 큰 테이블에서 소량의 데이터를 검색할 때 사용

 

인덱스 튜닝

1. 인덱스 스캔과정에서의 비효율을 줄이기 (인덱스 스캔 효율화, 소량만 스캔)

2. 테이블 액세스 횟수를 줄이기 (랜덤 액세스 최소화)

 

SQL 튜닝은 랜덤 I/O 줄이기

- 데이터베이스가 느린 이유는 디스크 I/O 때문임, 읽어야 하는 데이터량이 많고, 그 과정에서 디스크  I/O가 많이 발생할 때 느려짐

- 인덱스를 많이 사용하는 웹 시스템에서는 랜덤 I/O 가 중요

 

인덱스 구조 (B-Tree)

수직적 탐색 > 수평적 탐색 > 랜덤 액세스

- 인덱스는 대용량 테이블에서 필요한 소량의 데이터만 빠르고 효율적으로 액세스 하기 위해서 사용하는 오브젝트

- 테이블에서 인덱스 없이 데이터를 검색하려면, 테이블 전체를 스캔해야 하는데, 인덱스를 이용하면 일부만 스캔하고 멈출 수 있음

- 인덱스를 사용하면 Range Scan이 가능하고, 가능한 이유는 인덱스가 정렬되어있기 때문임

- Root블록과 Branch블록의 각 레코드는 하위 블록에 대한 주소 값을 가짐

- Leaf블록에 저장된 각 레코드는 키값 순으로 정렬되어 있고, 실제 테이블 레코드를 가리키는 주소 값인 ROWID를 가지고 있음

- 인덱스를 스캔하는 이유는 소량의 데이터만 빨리 찾고, ROWID를 얻기 위해서임

 

 

수직적 탐색 > 수평적 탐색 > ROWID로 테이블접근

 

수직적 탐색

- 인덱스 스캔의 시작점을 찾는 과정 (Root -> Branch -> Leaf)

- 수직적 탐색은 인덱스 스캔을 하기 위한 첫 번째 시작 지점을 찾는 과정

- 조건을 만족하는 첫 번째 레코드를 찾는 과정

 

수평적 탐색

- 데이터를 찾는 과정 (...... Leaf <-> Leaf <-> Leaf......)

- 인덱스 Leaf 블록은 서로 앞뒤 블록에 대한 주소 값을 가짐 (Double Linked List)

- 수직적 탐색으로 찾은 첫 번째 레코드에서부터 시작하여 수평적으로 탐색

- 조건절을 만족하는 모든 데이터를 찾기

- ROWID를 얻기