dongdorodongdong
인덱스 본문
인덱스
- 특징
- 원하는 데이터를 쉽게 찾을 수 있도록 돕는 것 (책의 찾아보기와 유사)
- 검색(조회) 성능의 최적화가 목표
- 동일 컬럼으로 구성된 인덱스를 중복으로 생성X (컬럼의 순서가 다른 것은 서로 다른 인덱스로 취급)
- 기본 인덱스에 중복된 키값, NULL 값 X
- 자주 변경되지 않는 컬럼이 좋은 인덱스 후보
- 테이블의 전체 데이터를 읽는 경우는 인덱스가 거의 불필요
- 대량의 데이터를 삽입할 때는 모든 인덱스를 제거하고 데이터를 입력
- 인덱스를 구성하는 컬럼의 순서는 성능에 영향을 줌
- DML 처리 성능을 저하 시킬 수 있음
- 인덱스를 구성하지 않는 컬럼의 데이터가 UPDATE될 때는 인덱스로 인한 부하가 발생하지 않음 - 종류
- 트리 기반 인덱스
- 클러스터형 인덱스 (SQL Server)
트리 기반 인덱스
- 특징
- 양방향 링크를 가지고 있음 (오름차순, 내림차순 검색 가능)
- 관계형 데이터베이스의 주요 인덱스 구조
- '=', BETWEEN, '>' 와 같은 연산자로 검색하는 일치, 범위 검색에 적합 - 구성
- Root Block
> 브랜치 블록 중 가장 상위
- Branch Block
> 분기를 목적으로 하는 블록
- Leaf Block
> 트리의 가장 아래에 존재
> 인덱스를 구성하는 컬럼의 데이터, 해당 데이터를 가지고 있는 행의 위치를 가리키는 레코드 식별자로 구성
> 인덱스 데이터는 정렬이 되어 있음 - 예시
- 37을 찾는 경우
1. Root Block 50보다 작으니, 왼쪽으로 분기
2. 11과 40 사이에 있으니, 가운데로 분기
3. 37을 바로 찾음
- 37과 50사이의 값을 찾는 경우
1. 위와 같은 방법으로 37을 찾음
2. 오른쪽으로 이동하며 인덱스를 읽음
클러스터형 기반 인덱스
- 특징
- SQL Server의 인덱스
- 인덱스의 Leaf Page가 곧 Data Page
- Leaf Page에 인덱스 키 컬럼과 나머지 컬럼을 같이 저장하기 때문에 랜덤 엑세스 할 필요가 없음
- Leaf Page를 탐색하면 해당 테이블의 모든 컬럼 값을 바로 얻을 수 있음
- 클러스터형 인덱스는 테이블당 한개만 생성 가능
- Oracle의 IOT와 매우 유사
BITMAP 인덱스
- 정의
- DW 및 AD-HOC 질의 환경(시스템에서 사용될 쿼리를 시스템 구현 시 모두 알 수 없는 경우)을 위해서 설계
- 하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 있는 구조
Full Table Scan
특징
- 테이블에 존재하는 모든 데이터를 읽어 조건에 맞으면 결과로 추출, 맞지 않으면 버리는 방식으로 검색
- HWM 아래의 모든 블록을 읽음
- 풀 테이블 스캔 방식으로 읽은 블록들은 메모리에서 바로 제거할 수 있도록 관리하기 때문에 재사용성이 떨어짐
* HWM (High Water Mark)
> 테이블에서 사용되었던 마지막 블록의 위치
> 행이 삽입될 때 마다 이동하지만 행이 삭제될때에는 이동하지 않음
> 풀 테이블 스캔 시 테이블의 마지막 블록을 인식하기 위해 사용
* 옵티마이저가 Full Table Scan을 선택하는 이유
> SQL문에 조건이 존재하지 않을 때
> SQL문의 조건에 사용가능한 인덱스가 존재X
> 테이블 내 조건을 만족하는 데이터가 많아서 옵티마이저가 테이블 전체를 읽어야 한다고 판단할 때
> 병렬처리 방식으로 처리하는 경우
Index Scan
- 특징
- 인덱스를 구성하는 컬럼의 값을 기반으로 데이터를 추출
- 인덱스의 Leaf Block은 인덱스를 구성하는 컬럼과 레코드 식별자로 구성
- 인덱스에 존재하지 않는 컬럼의 값이 필요할 땐, 레코드 식별자로 테이블에 접근
- 만약, SQL문에서 필요한 모든 컬럼이 인덱스 구성 컬럼에 포함된 경우에는 테이블을 엑세스X
- 인덱스 컬럼들의 정렬이 반환에도 적용 - 방식
- 인덱스 유일 스캔
- 인덱스 범위 스캔
- 인덱스 역순 범위 스캔
- 인덱스 전체 스캔
- 인덱스 고속 전체 스캔
- 인덱스 스킵 스캔 - 인덱스 유일 스캔
- Unique Index를 사용하여 단 하나의 데이터를 추출
- 중복 허락X
- Unique Index 구성 컬럼에 모두 '='로 값이 주어진 경우에만 가능한 스캔 방식 - 인덱스 범위 스캔
- 인덱스를 이용하여 한 건 이상의 데이터를 추출
- Unique Index 구성 컬럼에 모두 '='로 값이 주어지지 않은 경우, Non-Unique Index를 이용하는
모든 엑세스 방식에 가능한 스캔 방식 - 인덱스 역순 범위 스캔
- 인덱스의 Leaf Block의 양방향 링크를 이용하여 내림차순으로 데이터를 읽음
- 최댓값을 쉽게 찾음
Full Table Scan VS Index Scan
- 전체 테이블 스캔은 인덱스의 존재 유무에 상관없이 항상 이용 가능
인덱스 스캔은 사용 가능한 인덱스가 존재하는 경우에만 이용 가능 - 전체 테이블 스캔은 데이터를 읽을 때 한번의 I/O 요청으로 여러 블록을 한꺼번에 읽음
인덱스 스캔은 한번의 I/O 요청에 한 블록씩 읽음 (대용량의 데이터 중 일부의 데이터를 찾을 때 효율이 좋음)