인덱스는 원하는 데이터를 쉽게 찾을 수 있도록 돕는 책의 찾아보기와 유사한 개념이다. 인덱스는 테이블을 기반으로 선택적으로 생성할 수 있는 구조이다. 테이블에 인덱스를 하나만 생성해도 되고 여러 개를 생성해도 된다.
인덱스의 기본적인 목적은 검색 성능의 향상이다.
즉 검색조건을 만족하는 데이터를 인덱스를 통해 효과적으로 찾을 수 있도록 돕지만 insert, update, delete와 같은 연산에는 인덱스의 삽입, 수정, 삭제가 일어나기 때문에 추가적인 비용이 들어가게 되어 trade-off가 발생된다.
Table Scan 종류
FULL TABLE SCAN
- 전체 테이블 스캔방식으로 데이터를 검색한다는 것은 기본적으로 테이블에 존재하는 모든 데이터를 읽어가면서 조건에 맞으면 결과로써 추출하고 조건에 맞지 않으면 버리는 방식으로 검색한다.
오라클의 경우는 검색조건에 맞는 데이터를 찾기 위해서 테이블의 고수위 마크(HWM, High Water Mark)아래의 모든 블록을 읽는다.
고수위 마크는 테이블에 데이터가 쓰여졌던 블록 상의 최상위 위치를 의미한다.
이와 같이 전체 테이블 스캔방식은 테이블에 존재하는 모든 블록 데이터를 읽는다.
옵티마이저가 연산으로서 전체 테이블 스캔 방식을 선택하는 이유는 일반적으로 다음과 같다.
1) SQL문에 조건이 존재하지 않는 경우
- SQL문에 조건이 존재하지 않는다는 건 테이블에 존재하는 모든 데이터가 답이 된다는 것이다. 그렇기 때문에 테이블에 모든 블록을 읽으면서 무조건 결과로써 반환하면 된다.
2) SQL문의 주어진 조건에 사용 가능한 인덱스가 없는 경우
- 사용 가능한 인덱스가 존재하지 않는다면 데이터를 액세스 할 수 있는 방법은 전체 테이블을 모두 읽으면서 주어진 조건을 만족하는지를 검사하는 방법뿐이다.
또한 주어진 조건에 사용 가능한 인덱스는 존재하나 함수를 사용하여 인덱스 칼럼을 변형한 경우에도 인덱스를 사용할 수 없다.
3) 옵티마이저의 취사선택
- 조건을 만족하는 데이터가 많은 경우, 결과를 추출하기 위해서 대부분의 블록을 액세스해야 한다고 옵티마이저가 판단을 하면 조건에 사용가능한 인덱스가 존재해도 전체 테이블 스캔 방식으로 읽을 수 있다.
4) 그 밖의 경우
- 병렬 처리 방식으로 처리하는 경우와 FTS 방식의 힌트를 사용한 경우가 있다.
INDEX SCAN
인덱스 스캔의 여러 가지 방법 중 주로 사용되는 트리 기반의 인덱스를 알아보자
Index Scan은 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 기법이다. 인덱스의 리프 블록을 읽으면 인덱스 구성 칼럼의 값과 테이블 레코드 식별자(RID)를 알 수 있다. 인덱스에 존재하지 않는 칼럼의 값이 필요한 경우에는 현재 읽은 레코드 식별자를 이용하여 테이블을 액세스 해야 한다.
인덱스는 인덱스 구성 칼럼의 순서대로 정렬을 유지하고 있다. 예를 들어 복합 인덱스를 (A+B)로 구성하면 먼저 A로 정렬하고 A값이 동일한 경우 B로 정렬한다 그리고 B까지 모두 동일하면 RID로 정렬된다.
인덱스가 구성 칼럼으로 정렬되어 있기 때문에 인덱스를 경우하여 읽으면 그 결과 또한 정렬되어 반환되는 특징이 있다.
트리 기반의 인덱스 스캔 중 자주 사용되는 Index Unique Scan, Index Range Scan, Index Range Scan Descending에 대해 간단히 알아보자.
1) Index Unique
인덱스 유일 스캔은 유일 인덱스를 사용하여 단 하나의 데이터를 추출하는 방식이다. 유일 인덱스는 중복을 허락하지 않는 인덱스이다. 유일 인덱스는 구성 칼럼에 모두 = 로 값이 주어지면 결과는 최대 1건이 된다.
인덱스 유일 스캔은 유일 인덱스 구성 칼럼에 모두 = 로 값이 주어진 경우에만 가능한 인덱스 스캔 방식이다.
2) Index Range Scan
인덱스 범위 스캔은 인덱스를 이용하여 한건 이상의 데이터를 추출하는 방식이다. 유일 인덱스의 구성 칼럼 모두에 대해 = 연산자로 값이 주어지지 않는 경우와 비유일 인덱스(Non-Unique Index)를 이용하는 모든 액세스 방식은 인덱스 범위 스캔 방식으로 데이터를 액세스 한다. 트리구조의 인덱스는 리프 블록이 양방향 링크로 연결되어 있기 때문에 인덱스 범위 스캔이 가능하고 오름차순은 우측으로 내림차순은 좌측으로 탐색한다.
3) Index Range Scan Descending
인덱스 역순 범위 스캔은 인덱스 양방향 링크를 이용해 내림차순으로 읽는 방법이다.
이외에도 index full scan, fast full index scan, index skip scan 등이 존재한다.
'Database' 카테고리의 다른 글
파일 구조(file organization) (0) | 2021.05.02 |
---|---|
조인 수행원리 (0) | 2021.05.01 |
실행계획 (Execution Plan) (0) | 2021.05.01 |
SQL 최적화의 기본원리 (0) | 2021.05.01 |
절차형 SQL (0) | 2021.05.01 |
댓글