SQLP
[친절한 SQL 튜닝] 2. 인덱스 기본 [1]
Leesemo
2025. 1. 14. 22:25
2.1.1 미리 보는 인덱스 튜닝
데이터를 찾는 두 가지 방법
- 테이블 전체 스캔
- 인덱스를 이용 -> 큰 테이블에서 소량의 데이터를 검색할 때 사용
인덱스 튜닝의 두 가지 핵심요소
1. 인덱스 스캔 효율화 튜닝
- 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것
학생명부에서 시력이 1.0~1.5인 홍길동 학생을 찾는 경우를 예로 들어보자.
이름 | 시력 | 학년-반-번호 | |
강수지 | 1.5 | 4학년 3반 37번 | |
김철수 | 0.5 | 3학년 2반 13번 | |
... | ... | ... | |
이영희 | 1.5 | 6학년 4반 19번 | |
... | ... | ... | |
홍길동 | 1.0 | 2학년 6반 24번 | 이 부분만 스캔! |
홍길동 | 1.5 | 5학년 1반 16번 | |
홍길동 | 2.0 | 1학년 5반 15번 | |
... | ... | ... |
위 표에서 학생명부를 이름과 시력순으로 정렬해 두었다면, 이름이 홍길동인 데이터를 찾아 소량만 스캔하면 된다.
반면, 학생명부를 시력과 이름순으로 정렬해 두었다면,
아래 표처럼 똑같이 두 명을 찾는데도 많은 양의 데이터를 스캔해야 한다.
시력 | 이름 | 학년-반-번호 | |
0.5 | 김철수 | 3학년 2반 13번 | |
... | ... | ... | |
1.0 | 홍길동 | 5학년 1반 16번 | 여기부터 스캔! |
1.5 | 강수지 | 4학년 3반 37번 | |
1.5 | 이영희 | 6학년 4반 19번 | |
1.5 | 홍길동 | 1학년 5반 15번 | |
1.5 | ... | ... | |
2.0 | 홍길동 | 2학년 6반 24번 | |
... | ... | ... |
2. 랜덤 액세스 최소화 튜닝
- 테이블 액세스 횟수를 줄이는 것
- 인덱스 스캔 효율화 튜닝보다 성능에 미치는 영향이 더 크다.
SQL 튜닝은 랜덤 I/O와의 전쟁
데이터베이스 성능이 느린 이유는 디스크 I/O 때문이다. 읽어야 할 데이터량이 많고, 그 과정에 디스크 I/O가 많이 발생할 때 느리다.
2.1.2 인덱스 구조
인덱스는 대용량 테이블에서 필요한 데이터만 빠르게 효율적으로 액세스하기 위해 사용하는 오브젝트다.
색인과 같은 역할을 한다.
색인없이 '메모리 소트'를 학습하려면, 첫 페이지부터 마지막 페이지까지 다 뒤져야 하지만, 색인을 이용하면, 페이지를 탐색하는 시간을 줄일 수 있다.
DBMS는 일반적으로 BTree 인덱스를 사용한다.

- 루트와 브랜치 블록에 있는 각 레코드는 하위 블록에 대한 주소값을 갖는다.
- LMC(Leftmost Child) : 자식 노드 중 가장 왼쪽 끝에 위치한 블록
- 리프 블록에 저장된 각 레코드는 키값 순으로 정렬되어 있고, 테이블 레코드를 가리키는 주소값(ROWID)를 갖는다.
ROWID | : 데이터 블록 주소 + 로우 번호 |
데이터 블록 주소 | : 데이터 파일 번호 + 블록 번호 |
블록 번호 | : 데이터파일 내에서 부여한 상대적 순번 |
로우 번호 | : 블록 내 순번 |
인덱스 탐색 과정은 수직적 탐색과 수평적 탐색으로 나눌 수 있다.
- 수직적 탐색 : 인덱스 스캔 시작지점을 찾는 과정
- 수평적 탐색 : 데이터를 찾는 과정
2.1.3 인덱스 수직적 탐색
- 정렬된 인덱스 레코드 중 조건을 만족하는 첫 번째 레코드를 찾는 과정
- 인덱스 수직적 탐색은 루트(Root) 블록에서부터 시작
- 루트를 포함해 브랜치(Branch) 블록에 저장된 각 인덱스 레코드는 하위 블록에 대한 주소값을 가짐
2.1.4 인덱스 수평적 탐색
- 수직적 탐색을 통해 스캔 시작점을 찾았으면, 찾고자 하는 데이터가 더 안 나타날 때까지 인덱스 리프 블록을 수평적으로 탐색함
- 인덱스에서 본격적으로 데이터를 찾는 과정
- 인덱스 리프 블록끼리는 서로 앞뒤 블록에 대한 주소값을 가짐 -> 좌에서 우로, 우에서 좌로 탐색 가능(양방향 연결 리스트)
인덱스를 수평적으로 탐색하는 이유
- 조건절을 만족하는 데이터를 모두 찾기 위함
- ROWID를 얻기 위함(일반적으로 인덱스를 스캔하고서 테이블도 액세스함. 이때 ROWID가 필요함)
2.1.5 결합 인덱스 구조와 탐색
- 두 개 이상의 컬럼을 결합해서 인덱스를 만드는 것
- 선택도가 낮은 컬럼은 앞으로 두고 결합 인덱스를 생성해야 성능에 유리함(비교연산 횟수를 줄이기 위함)
더보기
'Balanced'의 의미
- BTree 인덱스의 'B'가 'Balanced'의 약자
- 어떤 값으로 탐색하더라도 인덱스 루트에서 리프 블록에 도달하기까지 읽는 블록 수가 같음을 의미
- 루트로부터 모든 리프 블록까지의 높이는 항상 같다.