[DB/SQLD] 인덱스(index)

1 분 소요

인덱스

  • 인덱스는 데이터를 빠르게 검색할 수 있는 방법을 제공한다.

  • 인덱스는 키로 정렬되어 있기 때문에 원하는 데이터를 빠르게 조회한다.

  • 인덱스는 오름차순 및 내림차순 탐색이 가능하다.

  • 하나의 테이블에 여러개의 인덱스를 생성할 수 있고 하나의 인덱스는 여러 개의 칼럼으로 구성될 수 있다.

  • 테이블을 생성할 때 기본키는 자동으로 인덱스가 만들어지고 인덱스의 이름은 SYSXXXX이다.

  • 인덱스의 구조는 Root Block, Branch Block, Leaf Block으로 구성되고 Root Block은 인덱스 트리에서 가장 상위에 있는 노드를 의미하며 Branch Block은 다음 단계의 주소를 가지고 있는 포인터로 되어있다.

  • Leaf Block은 인덱스 키와 ROWID로 구성되고 인덱스 키는 정렬되어 저장되어 있다. 또 Leaf Block은 Double Linked List 형태로 되어 있어서 양방향 탐색이 가능하다.

  • ROWID는 물리적 행 주소를 가지고 있고, ROWID를 사용해 테이블을 읽는다.

  • Leaf Block에서 인덱스 키를 읽으면 ROWID를 사용해서 테이블의 행을 직접 읽을 수 있다.



인덱스 생성

인덱스를 생성할 때 한 개 이상의 칼럼을 사용해서 생성할 수 있다. 인덱스 키는 기본적으로 오름차순으로 정렬하고 “DESC”구를 포함하면 내림차순으로 정렬한다.

CREATE INDEX IND EMP ON EMP (ENAME ASC, SAL DESC);

IND라는 이름의 인덱스를 생성한다. ENAME의 ASC는 생략이 가능하다.



인덱스 스캔(Index Scan)

1. 인덱스 유일 스캔(index unique scan)

인덱스의 키 값이 중복되지 않는 경우, 해당 인덱스를 사용할 때 발생된다. 예를 들어 empno(사원번호)가 중복되지 않는 경우 특정 하나의 EMPNO를 조회한다.

2. 인덱스 범위 스캔(index range scan)

select문에서 특정 범위를 조회하는 where문을 사용할 경우 발생한다. 인덱스의 leaf block의 특정 범위를 스캔한다. like, between이 있다. 물론 데이터 양이 적은 경우는 인덱스 자체를 실행하지 않고 table full scan이 될 수 있다.

3. 인덱스 전체 스캔(index full scan)

인덱스에서 검색되는 인덱스 키가 많은 경우 leaf block의 처음부터 끝까지 전체를 읽는다.

테이블을 읽을 때 high watermark 이하까지만 table full scan을 한다. high watermark는 테이블에 데이터가 저장된 블록에서 최상위 위치를 의미하고 데이터가 삭제되면 high watermark가 변경된다.