2013년 9월 9일 월요일

오라클 인덱스, 함수 기반 인덱스, 오라클인덱스활용,인덱스생성

오라클 인덱스, 함수 기반 인덱스, 오라클인덱스활용,인덱스생성

Function Based Index
========================
SQL 문장의 WHERE 절에 SQL함수(SQL Function)가 사용되는 경우 인덱스 컬럼에 변형이 생기는 경우이므로 인덱스를 사용못하는 경우가 있습니다. 이러한 경우를 해결할 수 있는것이 함수 기반 인덱스인데...

우선 아래의 예문을 볼까요?
(EMP 테이블의 ENAME 컬럼에 대해 인덱스가 걸려 있다고 가정 합니다.)

SQL>SELECT ENAME, SAL
FROM EMP
WHERE SUBSTR(ENAME,0,1) = '김';

물론 위의 경우 WHERE ENAME LIKE '김%' 라고 하는것이 바람직하겠지만 인덱스 컬럼에 대해 변형을 가하는 예문이라고 생각하시구요, 위 경우 처럼 인덱스가 존재하는 컬럼에 대해 SQL함수를 사용하게 되면 인덱스 컬럼에 변형이 생겨 ENAME에 대해 생성되어 있는 인덱스를 사용하지 못합니다. 이럴때 함수 기반 인덱스(Function Based Index)를 사용하면 해결할 수 있는데 다음처럼 인덱스를 만듭니다. 또한 인덱스가 생성될 컬럼에는 SQL함수나 산술식, 상수, 사용자 정의 함수를 적용할 수 있습니다.

SQL>create indexidx_emp_ename on emp(substr(ename, 0, 1));

이러한 함수 기반 인덱스의 경우 다음과 같은 장단점이 있는데...

장점이라면 당연히 인덱스 컬럼에 SQL함수등을 적용하여 변형을 가하더라도 인덱스를 사용하여 빠른 Access를 보장하는 것일거구요,,, DML사용시 함수를 사용하여 인덱스 값을 저장해야 하므로 overhead가 생길수 있으며 인덱스 사용에 있어서도 WHERE절에 함수 기반 인덱스가 적용된 SQL함수가 있는 경우에만 인덱스가 사용 가능하며 다른 조건들에 대해서는 인덱스를 사용할 수 없습니다. 즉 위의 경우 ename like '김%', ename = '홍길동'과 같은 경우에는 인덱스를 사용할 수 없다는 이야기죠^^...

또한 함수기반 인덱스(Function Based Index)를 생성하면 기본적으로 bitmap 인덱스가 생성되며 인덱스 생성은 system 권한이 있어야 가능합니다.. 이 함수기반 인덱스가 생성하기에 제일 까다로운데... Oracle parameter중 compatible 값이 8.1.0 이상으로 되어 있어야 하며 QUERY_REWRITE_ENABLE parameter 값이 TRUE, QUERY_REWRITE_INTEGRITY parameter가 TRUSTED로 되어 있어야 합니다. 그리고 해당 ORACLE USER가 QUERY REWRITE 권한이 있어야 하구요...

세션 레벨에서 위에서 말한 조건을 정의합니다. 물론 compatible patamter인 경우엔 변경 후 적용을 위해서는 DB 를 restart해야 합니다.

SQL>alter session set QUERY_REWRITE_ENABLED = TRUE;
SQL>alter session set QUERY_REWRITE_INTEGRITY=TRUSTED;
SQL>grant query rewrite to 오라클사용자명;

감사합니다.



오라클자바커뮤니티 실무 개발자 과정 - 개인80% 환급


댓글 없음:

댓글 쓰기