테이블에서 데이터를 찾는 두 가지 방법
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를 얻기
'DATABASE > 튜닝' 카테고리의 다른 글
[SQL 튜닝] 인덱스를 이용한 소트 연산 (0) | 2020.06.22 |
---|---|
[SQL 튜닝] 인덱스 기본 사용법 (0) | 2020.06.15 |
[SQL 튜닝] Table Full Scan VS Index Range Scan VS Index Full Scan (0) | 2020.06.08 |
[SQL 튜닝] 데이터베이스 저장 구조와 I/O 메커니즘 (0) | 2020.06.07 |
[SQL 튜닝] SQL 공유 및 재사용(라이브러리 캐시, SQL캐싱) (0) | 2020.06.07 |