✨ INDEX?
인덱스는 원하는 데이터를 쉽게 찾을 수 있도록 책에 책갈피를 꽂아놓는 것과 같다.
테이블 기반 선택적으로 생성할 수 있으며, 생성하지 않을 수도 있고 여러 개를 생성해도 된다. 인덱스의 기본 목적은 검색 성능의 최적화이며 검색 조건을 만족하는 데이터를 효과적으로 사용할 수 있게 돕는다.
그러나 insert, update, delete등과 같은 dml 작업을 수행할 때 테이블과 인덱스를 함께 변경해야 하기 때문에 오히려 느려질 수 있다.
🪡 트리 기반 인덱스
DBMS에서 가장 일반적인 인덱스는 B-Tree Index이다.
브랜치 블록(Branch Block) 과 리프 블록(Leaf Block)으로 구성되어 있으며, 가장 상위에 있는 블록을 루트 블록(Root Block)이라고 한다.
루트블록 아래의 브랜치 블록은 분기를 목적으로 하고 있는 블록으로, 이 아래에 있는 리프 블록을 가리키는 포인터들을 가지고 있다.
아래에 있는 리프 블록은 인덱스를 구성하는 칼럼의 데이터와 해당 데이터를 가진 행의 위치를 가진 RID로 구성되어 있으며, 리프 블록의 경우 양방향 리프의 형태를 가지고 있기 때문에 오름차순과 내림차순 검색을 쉽게 할 수 있다. 그러므로 B-Tree는 비교 연산자로 검색할 경우에 유용하게 사용 가능하다.
이와 같은 구조를 가지고 있기 때문에, 트리 탐색 기법을 사용하여 검색을 수행하게 된다.
🧶 전체 테이블 스캔과 인덱스 스캔
전체 테이블 스캔
인덱스를 삽입하지 않은 전체 테이블 스캔 방식은, 테이블에 존재하는 모든 데이터를 읽으면서 조건에 맞을 경우 결과 추출을 하는 것이다.
그렇기 때문에 데이터를 검색할 때, 테이블 데이터가 쓰여진 블록의 최상위 위치 아래의 모든 것을 읽어나간다. 자바로 생각하면 for 문을 통하여 배열의 끝까지 break 없이 계속 검색해나가는 것과 동일하다. 이렇게 읽은 것을 다시 사용할 일은 극히 드물기 때문에, 읽은 블록은 메모리에서 제거될 수 있도록 관리된다.
옵티마이저가 이 방식을 선택하는 이유는 일반적으로
1) SQL 문에 조건이 존재하지 않는 경우 (where/having) : 전체 데이터가 추출되어야 하기 때문에 모든 블록을 읽고 반환해야 한다.
2) 인덱스가 존재하지 않는 경우 : 데이터를 찾을 수 있는 방법은 전체 테이블을 순회하며 주어진 조건이 맞는지 검사하는 것밖에 없다.
3) 옵티마이저의 취사 선택 : 조건을 만족하는 데이터가 많을 경우, 결과 추출을 위해 모든 것을 엑세스하는게 맞다고 판단하면 인덱스가 존재해도 전체 테이블을 스캔할 수 있다.
4) 그 밖의 경우 : 병렬처리 방식을 사용하거나 전체 테이블 스캔 방식을 사용자가 선택한 경우 해당 방법으로 데이터를 읽을 수 있다.
인덱스 스캔
인덱스 스캔은 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 엑세스 방식이다.
검색을 위해서 인덱스의 리프 블록을 읽으면, 인덱스 구성 칼럼의 값과 테이블의 레코드 식별자를 알 수 있으며 인덱스에 존재하지 않는 칼럼일 때에는 현재 읽은 레코드의 식별자를 이용, 테이블 엑세스가 가능하며 필요한 모든 칼럼이 인덱스 구성 칼럼에 포함되어 있는 경우는 테이블에 대한 엑세스는 필요하지 않다.
1) 인덱스 유일 스캔(Unique Index) : 유일한 인덱스를 사용, 단 하나의 데이터를 추출하는 방식이다. 유일 인덱스는 중복을 허용하지 않으며, 구성 칼럼에 모두 '=' 값이 주어지며 결과는 1건이 도출된다.
2) 인덱스 범위 스캔(Range Scan) : 인덱스를 이용해 한 건 이상의 데이터를 추출하는 것이다. 유일 스캔도 이 방식으로 엑세스하는 것에 포함된다고 볼 수 있다.
🏹 정리
인덱스는 결국 특정 범위마다 태그를 달아서, 그것을 찾기 쉽도록 하는 것과 같다. 그러나 1, 2 ,3 태그가 있을 때 셋의 태그를 전부 다 불러오고자 하면 전체를 가져오는 것이기 때문에 전체 테이블 스캔 방식을 사용하게 될 것이다.
인덱스 스캔은 사용 가능한 인덱스가 존재해야 한다는 점이 있지만, 코스트에서 확연한 장점이 있다.
그러므로 사용을 하게 될 때는 최대한 변화가 일어나지 않을 테이블에서, 검색 조건이 고정이 될 경우에 하는 것이 옳을 것이다.
'DBMS' 카테고리의 다른 글
데이터베이스 아키텍처 (0) | 2024.04.08 |
---|---|
조인 수행 원리 (1) | 2024.04.05 |
옵티마이저와 실행계획 (0) | 2024.04.04 |
절차형 SQL (0) | 2024.04.04 |
DCL (0) | 2024.04.01 |