💡 핵심 원리를 알아보자
인덱스 튜닝의 두 가지 핵심 요소
- 인덱스 스캔 효율화 튜닝
- 랜덤 액세스 최소화 튜닝(테이블 액세스 횟수를 줄이는 것) ⇒ 이것이 중요!!
인덱스 구조
대용량 테이블에서 필요한 데이터만 빠르게 효율적으로 액세스하기 위해 사용하는 오브젝트 (책에 있는 색인 느낌!)
인덱스가 없다면?
- 테이블을 처음부터 끝까지 모두 읽어야합니다.
인덱스를 사용한다면?
- 일부만 읽고 멈춘다. ⇒ 범위 스캔
인덱스가 사용하는 알고리즘은? B-트리
일반적으로 DBMS에서는 주로 B+-Tree 또는 B*-Tree가 사용된다.
주의할 점이 B는 binary(이진)이 아닌 Balanced 입니다.
insert 작업 또는 delete 작업을 할 때 인덱스가 불균형 상태에 놓일 수도 있을거라고 생각을 하게 되는데 B*tree에서는 이런 현상이 절대 발생하지 않는다. 즉 balanced는 인덱스 루트에서 리프 블록에 도달하기까지 읽는 블록 수가 같음을 의미합니다.
root, branch, reaf로 구성되어 있습니다.
그리고 루트와 브랜치 블록에 있는 각 레코드는 하위 블록에 대한 주소값을 가지고 있습니다.
인덱스를 찾는 과정
수직적 탐색
인덱스 스캔 시작지점을 찾는 과정입니다. ⇒ 아까 말한 각 레코드는 하위 블록에 대한 주소값을 가지고 있기 때문에 루트블록에서 리프 블록까지 수직적 탐색이 가능한 이유입니다.
즉 조건을 만족하는 레코드를 찾는 과정이 아니라 조건을 만족하는 첫 번째 레코드를 찾는 과정이다!!!
수평적 탐색
수직적 탐색으로 시작점을 찾았으면 착고자 하는 데이터가 더 안나타날 때까지 인덱스 리프 블록을 수평적으로 스캔한다. 리프 블록끼리는 서로 앞뒤의 블록에 대한 주소값을 가지는 연결 리스트 구조이기 때문에 수평적으로 탐색이 가능하다.
즉 조건절을 만족하는 데이터를 모두 찾기 위해서 + rowid를 얻기 위한 과정이다.
결합 인덱스 구조와 탐색
두 개 이상 컬럼을 결합해서 인덱스를 만들 수 있다.
인덱스가 [성별 + 이름]이라면 인덱스 찾는 과정에서 인덱스 스캔 시작점이 성별 = ‘남’이 아니라 성별=’남’ 이면서 고객명 = ‘홍길동’인 레코드를 찾는다.
인덱스는 다음 조건을 가질 때 효율적이다.
- 카디널리티 (Cardinality) 높은 것 (중복도)
- 선택도 (Selectivity) 낮은 것
참고 자료
https://12bme.tistory.com/138
'책 > 친절한 sql 튜닝' 카테고리의 다른 글
2장. 인덱스 - 인덱스 확장 기능 사용법 (0) | 2023.03.27 |
---|---|
2장. 인덱스 - 인덱스 기본 사용법 (0) | 2023.03.27 |
1장. SQL 처리 과정과 IO - 데이터 저장 구조 및 I/O 매커니즘 (0) | 2023.03.27 |
1장. SQL 처리 과정과 IO - SQL 공유 및 재사용 (0) | 2023.03.27 |
1장. SQL 처리 과정과 IO - SQL 파싱과 최적화 (0) | 2023.03.27 |