해당 포스트는
SQLD를 학습하며 정리한 내용에 대한 포스트입니다.
이론을 학습한 내용을 정리하고 퀴즈, 기출문제 등을 기록하려고 합니다.
🌈 INDEX (인덱스)
💻 인덱스
인덱스는 데이터를 빠르게 검색할 수 있는 방법을 제공한다.
인덱스는 인덱스 키(ex. EMPNO)로 정렬(SORT)되어 있기 때문에 원하는 데이터를 빠르게 조회한다.
인덱스는 오름차순(ASCENDING) 및 내림차순(DESCENDING) 탐색이 가능하다.
하나의 테이블에 여러 개의 인덱스를 생성할수 있고 하나의 인덱스는 여러 개의 컬럼으로 구성될 수 있다.
테이블을 생성할 때 기본키(Primary Key)는 자동으로 인덱스가 만들어지고 인덱스의 이름은SYSXXXX이다.
인덱스의 구조는 Root Block, Branch Block, Leaf Block으로 구성되고
Root Block은 인덱스트리에서 가장 상위에 있는 노드를 의미하며
Branch Block은 다음 단계의 주소를 가지고 있는 포인터(Pointer)로 되어 있다.
Leaf Block은 인덱스 키와 ROWID로 구성되고 인덱스 키는 정렬되어 저장되어 있다.
위의 예는 인덱스를 스캔하고 테이블을 참조하는 것을 설명하고 있다.
Leaf Block은 Double Linked List 형태로 되어 있어서 양방향 탐색이 가능하다.
Leaf Block에서 인덱스 키를 읽으면 ROWID를 사용해서 EMP 테이블의 행을 직접 읽을 수 있다.
💻 인덱스 생성
인덱스 생성은 “CREATE INDEX” 문을 사용해서 생성이 가능하다.
인덱스를 생성할 때는 한 개 이상의 컬럼을 사용해서 생성할 수 있다.
인덱스 키는 기본적으로 오름차순으로 정렬하고 “DESC” 구를 포함하면 내림차순으로 정렬한다.
위의 예는 ENAME에 대해서 오름차순으로 정렬하고 SAL은 내림차순으로 정렬하는 인덱스를 생성한다.
여기서 ENAME에 “ASC” 구는 생략이 가능하다.
💻 인덱스 스캔
인덱스 유일 스캔(Index Unique SCAN)
Index Unique SCAN은 인덱스의 키 값이 중복되지 않는 경우, 해당 인덱스를 사용할 때 발생된다.
- 예를 들어 EMPNO(사원번호)가 중복되지 않는 경우 특정 하나의 EMPNO를 조회한다.
인덱스 범위 스캔(Index Range SCAN)
Index Range SCAN은 SELECT문에서 특정 범위를 조회하는 WHERE문을 사용할 경우 발생한다.
- Like, Between이 그 대표적인 예이다.
물론 데이터 양이 적은 경우는 인덱스 자체를 실행하지 않고 TABLE FULL SCAN이 될 수 있다.
Index Range SCAN은 인덱스의 Leaf Block의 특정 범위를 스캔한 것이다.
- Index Range SCAN은 인덱스의 특정 범위를 스캔한 것을 의미한다. (관계 연산자 사용)
인덱스 전체 스캔(Index Full SCAN)
Index Full SCAN은 인덱스에서 검색되는 인덱스 키가 많은 경우에 Leaf Block의 처음부터 끝까지 전체를 읽어 들인다.
High Watermark
Table Full Scan은 테이블의 데이터를 모두 읽은 것을 의미한다.
테이블을 읽을 때 High Watermark 이하까지만 Table Full Scan을 한다.
High Watermark는 테이블에 데이터가 저장된 블록에서 최상위 위치를 의미하고 데이터가 삭제되면 High Watermark가 변경된다.
🎯 추가 내용
❌ 인덱스는 Equal 조건만 사용할 수 있다. ❌
👉 인덱스는 Equal 조건뿐만아니라 BETWEEN, >와 같은 연산자로 검색하는 범위검색에서도 사용할 수 있다.
📚 레퍼런스
정미나. (유튜브 선생님에게 배우는) 유선배 SQL개발자(SQLD) 과외노트 / [정미나 저] (2023). Print.
한국데이터산업진흥원. SQL 자격검정 실전문제 : 국가공인 SQL전문가·국가공인 SQL개발자 / 한국데이터산업진흥원 [편] (2020). Print.