ksw_devlog
index(인덱스) 본문
index : 정렬해놓은 컬럼사본
Binary search tree => B-tree => B+tree
인덱스
- 어떤 데이터가 디스크의 어느 위치에 있는지에 대한 정보를 가진 주소록과 같음
- 데이터 - ROWID(주소) 쌍으로 저장됨
- 일반적인 select 쿼리 실행 시 먼저 메모리의 database buffer cache를 체크
- buffer cache에는 자주 사용되는 테이블들이 캐싱되어 있어 여기에 데이터가 있을 경우 바로 찾아 출력하고 없을 경우 하드디스크에 있는 데이터 파일에서 데이터를 찾음
- 인덱스를 사용하면 이런 과정을 거치지 않고 바로 주소를 통해 찾아감
인덱스 생성 원리?
- 해당 테이블을 모두 읽고 인덱스를 만드는 동안 데이터가 변경되면 문제가 되므로 해당 데이터들이 변경되지 못하도록 조치한 후 메모리(PGA의 Sort Area)에서 정렬
- 전체 테이블 스캔 → 정력 → Block 기록 (PGA내의 Sort Area 공간 부족시 Temporary Tablespace이용해 정렬)
동작원리
- 데이터 파일의 블록이 10만개가 있다고 가정할때 select문 실행시
- 1) server process가 구문분석과정을 마친후 database buffer cache에 조건에 부합하는 데이터가 있는지 확인
- 2) 해당 정보가 buffer cache에 없다면 디스크 파일에서 조건에 부합하는 블럭을 찾아 database buffer cache에 가져온 뒤 사용자에게 보여줌
- 이 경우 index가 없으면 10만개 전부 database buffer cache로 복사한뒤 풀스캔으로 찾게됨
- index가 있으면 where절의 조건의 컬럼이 index의 키로 생성되어있는지 확인한 뒤, 인덱스에 먼저 가서 조건에 부합하는 정보가 어떤 ROWID를 가지고 있는지 확인 후 ROWID에 있는 블럭을 찾아가 해당 블럭만 buffer cache에 복사
인덱스 사용이 불가능한 경우?
- 인덱스 컬럼을 조건절에서 가공하면 인덱스 사용이 불가능
- 부정형 비교는 인덱스 사용 불가능
- is null 조건만으로는 인덱스 사용 불가