본문 바로가기
SQL 이야기/SQL튜닝

2장. 인덱스 기본 - 인덱스 구조 및 탐색

by bjgu97 2022. 6. 8.
반응형

데이터베이스 테이블에서 데이터를 찾는 방법

1) 테이블 전체 스캔 (ex: 모든 교실 돌며 학생 찾기 -> 찾고자 할 학생 많을 때)

2) 인덱스 이용(ex: 이름순으로 정렬한 학생명부 이용하기 -> 찾고자 할 학생 몇 안될 때)

즉, 인덱스는 "큰 테이블에서 소량 데이터 검색할 때" 사용

 

인덱스 튜닝의 두 가지 핵심 요소

1) 인덱스 스캔 효율화 튜닝 

: 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것

ex) 정렬 순서(이름 - 시력, 시력-이름)에 따라 효율성 달라짐

2) 랜덤 액세스 최소화 튜닝

: 테이블 액세스 횟수를 줄이는 것

ex) 이름순 정렬 테이블 > 시력순 정렬 테이블

-> '랜덤 액세스 최소화 튜닝'이 성능에 더 큰 영향을 미친다!

즉, SQL 튜닝은 랜덤 I/O와의 전쟁이다.

 

 인덱스란?

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

- 인덱스는 정렬돼있기 때문에, 일부만 읽고 멈출 수 있는 '범위 스캔'이 가능하다.

 

B-tree 인덱스란?

: 뿌리(Root)가 위쪽, 가지(Branch)를 거쳐 맨 아래에 잎사귀(Leaf)가 있는 구조.

- 루트와 브랜치 블록의 각 레코드는, 하위 블록에 대한 주솟값 갖는다.

- 키값은, 하위 블록에 저장된 키값의 범위 나타냄

LMC(Leftmost Child) : 자식 노드 중 가장 왼쪽 끝에 위치한 블록 가리킴. 

- LMC가 가리키는 주소로 찾아간 블록에는, 키값을 가진 첫 번째 레코드보다 작거나 같은 레코드.

리프 블록에 저장된 각 레코드는..

- 키값 순으로 정렬

- ROWID(테이블 레코드 가리키는 주소값) 가짐.

(인덱스 키값 같으면 ROWID 순으로 정렬됨)

ROWID = 데이터 블록 주소 + 로우 번호
데이터 블록 주소 = 데이터 파일 번호 + 블록 번호
블록 번호 : 데이터파일 내에서 부여한 상대적 순번
로우 번호 : 블록 내 순번

 

인덱스의 수직적 탐색

: 인덱스 스캔 시작지점을 찾는 과정(정렬된 인덱스 레코드 중 조건 만족하는 첫 번째 레코드 찾는 과정)

- 루트(Root) 블록에서부터 탐색 시작, 리프(Leaf) 블록까지.

(브랜치 블록의 각 인덱스 레코드는 하위 블록에 대한 주솟값 갖고 있기 때문에 가능)

- 찾고자 하는 값보다 크거나 같은 값 만나면, 직전 레코드가 기리키는 하위 블록으로 이동

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

 

 인덱스의 수평적 탐색

: 인덱스에서 본격적으로 데이터를 찾는 과정

(수직적 탐색 통해 스캔 시작점 찾은 후, 찾고자 하는 데이터가 더 안 나타날 때까지 인덱스 리프 블록을 수평적으로 스캔)

- 인덱스 리프 블록은 서로 앞뒤 블록에 대한 주소값을 갖는 양방향 연결 리스트 구조

인덱스 수평적 탐색 이유:

1) 조건절 만족하는 데이터 모두 찾기 위해

2) ROWID 얻기 위해(인덱스 스캔 후 테이블 액세스시)

 

결합 인덱스 구조와 탐색

: 두 개 이상 칼럼 결합해서 만든 인덱스

 

 

댓글