CREATE INDEX ...문 사용⭐️ 인덱스 스캔이 전체 스캔보다 항상 빠른 것은 아니다!!
대용량 데이터를 읽을 경우에는 인덱스 스캔보다 테이블 전체 스캔이 유리할 수도 있다.
⭐️ insert, delete 작업과 다르게 update 작업에서는 부하가 없을 수도 있다???
인덱스 구성하는 컬럼 이외의 데이터가 update될 때는 인덱스로 인한 부하가 발생하지 않는다.
| 인덱스 종류 | 설명 |
|---|---|
| Balance Tree | - RDB에서 가장 많이 사용되는 인덱스 |
| B-Tree | - 브랜치 블록과 리프 블록으로 구성 - 브랜치 블록 : 분기를 목적 - 리프 블록 : 인덱스를 구성하는 컬럼의 값으로 정렬 - 일반적으로 OLTP 시스템 환경에서 가장 많이 사용 - 일반적으로 테이블 내의 데이터중 10%이하의 데이터를 검색할 때 유리하다. - 일치 및 범위 검색에 적절한 인덱스이다. |
| CLUSTERED | - 인덱스의 리프 페이지가 곧 데이터 페이지 - 리프 페이지의 모든 데이터는 인덱스 키 컬럼 순으로 물리적으로 정렬되어 저장 - SQL Server 클러스터형 인덱스 |
| BITMAP | - DW 및 AD-HOC 질의 환경을 위해서 설계 - 하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 잇는 구조 |
인덱스 구조
- 브랜치 블록
- 리프 블록 : 인덱스 구성하는 컬럼, 레코드 식별자(해당 데이터를 가지고 있는 행의 위치)로 구성
- 루트 블록
인덱스 스캔은 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 액세스 기법이다.
| 스캔 종류 | 설명 | SQL |
|---|---|---|
| 인덱스 유일 스캔 (Index Unique SCAN) | - 인덱스 키 값이 중복되지 않는 경우 - 특정한 하나의 행을 조회함 | SELECT * FROM 테이블 WHERE idx컬럼 = 1001; |
| 인덱스 범위 스캔 (Index Range SCAN) | - 인덱스 Leaf Block의 특정 범위를 스캔 - 범위 조회 WHERE문, LIKE, BETWEEN | SELECT * FROM 테이블 WHERE idx컬럼 >= 1001; |
| 인덱스 전체 스캔 (Index Full SCAN) | - 검색되는 인덱스 키가 많은 경우 - Leaf Block의 처음~끝까지 전체를 읽음 | SELECT * FROM 테이블 WHERE idx컬럼 Like '%' AND idx컬럼 > 0; |