====================
간단히 구두로 알게 된 내용을 정리해 놓은 글로
[목적]
오라클에서 인덱스는 테이블에 들어있는 방대한 데이터나 여러 조건들로 쿼리의 조회 성능이 떨어지는 경우, 성능 향상을 위해 미리 생성해 두는 것.
[생성/삭제]
인덱스 생성
CREATE [UNIQUE] INDEX [스키마명.]인덱스명
ON [스키마명.]테이블명 (컬럼1 [, 컬럼2, 컬럼3, ...])
인덱스 삭제
DROP INDEX [인덱스명]
인덱스를 삭제할 때는 단일 컬럼으로 구성할 수도 있고, 잦은 빈도로 사용하는 조건이 있는 경우 여러 컬럼을 설정하여 복합 인덱스를 생성하기도 한다..
[예시]
서류접수(서류ID, 서류순번, 신청인ID, 서류접수일, 전산등록일, 서류내용, 등록구분코드, 진행상태코드)
[필요성]
위와 같은 테이블이 있을 때 다년간 축적된 데이터인 경우 방대한 데이터가 있고 키 값이 아닌 특정 조건으로 데이터를 찾고 싶은 경우 조건을 걸어서 조회할 때 조회 쿼리의 실행시간으로 낭비되는 시간을 줄이고 빠른 조회 성능을 얻고자 한다.
그래서 해당 테이블에
인덱스1(서류접수일, 등록구분코드, 진행상태코드)
와 같은 인덱스가 생성되어 있다고 가정한다.
위 상태에서 인덱스에 지정된 컬럼의 순서는 중요하다.
인덱스가 생성될 떄 각 컬럼들은 순차적으로 정렬? 되어 저장되기 때문에 인덱스를 사용하는 힌트절을 사용할 때 설정된 인덱스 컬럼 중 일부가 빠져있다면 효율을 발휘할 수 없기 때문이다.
예를들어 조건절에 서류접수일 진행상태코드만 존재하는 경우
서류접수일 컬럼에 대해서는 인덱스가 효율을 발휘하지만 그 다음 등록구분코드가 없기 때문에 등록구분코드, 진행상태코드는 인덱스의 효율을 받지 못한다.
또한 인덱스가 생성될 때 정렬이 되어 ‘이미 저장’되었기 때문에 만약
SUBSTR(서류접수일, 6), 등록구분코드, 진행상태코드가 조건으로 사용된 경우에도 서류접수일이 저장된 서류접수일과 값이 다르기 때문에 서류접수일부터 인덱스의 효율을 볼 수 없다.
그리고 range에 대한 것도 인덱스의 효율을 볼 수 없다.
Equal(=), In 처럼 이퀄에 대한 것만 인덱스 효율을 볼 수 있다.