본문 바로가기

DB/오라클

[oracle] index (Function-Based Index)

index는 실행을 더욱 빠르게 찾게해준다

 

테이블(또는 파일등의 저장소)에는 데이터들이 순서없이 저장되어있다

 

인덱스(b*tree)는 트리구조로 정렬이 되어있어 접근이 더욱 빠르다

 

실행계획을 보면 index를 지나는지 알수있는데 

 

인덱스컬럼에 변형이 생기는경우 인덱스를 사용하지 못한다

 

(e.g.) emp table의 empno의 인덱스를 만들고 진행해보자

 

create index idx_emp_empno
on emp(empno);

이제 empno컬럼은 인덱스를 거치게된다

아래 실행계획을 보면 index range scan이 나온다

내 쿼리문이 index를 사용했다는것이다

 

하지만 인덱스 컬럼에 변화를 주면 full scan 하는것을 확인할수 있다.

 

 

Q. 
table이 아니라 index가 나오는데 index를 사용한것 아닌가요? index가 없을때는
실행계획에 table이 나오잖아요

 

A.

맞다. 사실 원래 바로아래사진과 같이  table이 나와야한다고 한다.

하지만 나는 어떤 세팅이 추가되어있는지 index full scan이 나왔다 

이유는 정확히 모르겠지만 dbms는 table보다 index full scan이 맞다고 판단해서 저렇게 했다

 

이렇게만 알고있자

인덱스 컬럼을 가공해서 사용하면 인덱스를 타지 못하는 경우가 있다 (대부분 그렇다고한다)

 

 

 

무튼 돌아와서 인덱스를 못하는 문제는 FBI(Function-Based Index)로 해결한다

함수 기반 인덱스를 사용하는것이다.

인덱스를 만들때 아에 적용할 값을 넣는것이다.

create index idx_emp_empno
on emp(empno+50);

이렇게 하면 인덱스를 사용할수 있다.

 

 

장점

인덱스 컬럼에 변형을 가해도 인덱스를 사용해서 빠른 접근이 가능

 

단점

저장 공간차지

다른조건이면 바로 fullscan