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
'DB > 오라클' 카테고리의 다른 글
[oracle] trim, rtrim, ltrim 단일행 함수 (0) | 2022.08.30 |
---|---|
[oracle] number타입 (0) | 2022.08.23 |
[oralce]PL/SQL Wrapper error: Couldn't process command line arguments. (0) | 2022.07.25 |
[oracle] edit으로 명령어 줄여쓰기 (.feat bat-명령프롬프) (0) | 2022.07.25 |
[oracle] developer the network adapter could not establish the connection (0) | 2022.01.26 |