Programming/Oracle

Function based index

초록깨비 2008. 12. 2. 13:25
728x90

ORACLE8i에서는 FUNCTION BASED INDEX라는 확장된 INDEX의 개념이 도입되었다. 이것은 이전에 모든 사용자가 원했던 B*Tree 인덱스의 제한사항을 다소 완화시켰다. 그러면 이러한 확장 인덱스가 가지는 의미는 무엇이고, 어떤 매카니즘으로 동작하며, B*Tree 인덱스의 어떤 단점을 보완할 수 있는지 알아보자

SCOPE & APPLICATION

FUNCTION BASED INDEX의 기본적인 개념과 활용방안

KEY IDEA

Function based index, Index

SUPPOSITION

 

DESCRIPTION

B*Tree INDEX는 정해진 규칙을 준수해야만 INDEX를 사용할 있어 INDEX 컬럼을 가공해야 하는 경우나 계산된 값으로 driving을 해야 하는 경우에 많은 비효율이 발생하게 된다. 그러나 ORACLE8i부터는 FUNCTION BASED INDEX를 이용하게 되면 이러한 B*Tree INDEX의 단점을 다소 완화 시킬 수 있다.

이전에는 왜 이러한 인덱스 개념이 사용되지 못했을까 궁금해 할지도 모른다. B*Tree의 인덱스 구조를 보면 인덱스를 구성하는 컬럼과 ROWID로 이루어져 있으며, ROWID는 테이블의 모든 ROWS 1:1로 연결되어 있어 인덱스를 구성하는 컬럼이 다른 임의의 값으로 저장된다고 하더라도 전혀 문제가 될것 같지 않다. FUNCTION BASED INDEX가 아직까지도 많은 제약사항을 가지고 있다는 것은 이렇게 단순하지만은 않다는 것을 시사한다. 자세한 이유는 이후에 한번 언급을 하기로 하고 여기에서는 기본적인 사항 및 사용방법에 대하여 논의하도록 하자.

FUNCTION BASED INDEX는 인덱스를 생성하고자 하는 테이블의 하나 이상의 컬럼을 포함하는 FUNCTION 이나 EXPRESSION에 인덱스를 생성할 수 있으며, FUNCTION이나 EXPRESSION를 미리 계산하여 INDEX에 저장하게 된다.

인덱스를 만들기 위해 사용되는 FUNCTION ARITHMETIC EXPRESSION,PL/SQL FUNCTION,PACKAGE FUNCTION,C Callout, SQL FUNCTION등을 포함할 수 있다.

1.OPTIMIZATION

Function-Based Index를 사용하기 위해서는 Cost-Based optimization을 사용하고 통계정보를 생성해야만 한다.그렇지않으면 SQL를 처리하기 위해 인덱스를 사용할 수 없게 된다.

2.FUNCTION BASED INDEX를 생성하기 위한 REQUIREMENT

1) FUNCTION BASED INDEX를 생성하기 위해서는 다음의 initialization parameters를 지정해야 한다.

- QUERY_REWRITE_INTEGRITY = TRUSTED

- QUERY_REWRITE_ENABLED = TRUE

- COMPATIBLE = 8.1.0.0.0 or greater value

2) 사용자는 CREATE INDEX, QUERY REWRITE, CREATE ANY INDEX, GLOBAL QUERY REWRITE에 대한 권한을 가져야 한다.

3.FUNCTION BASED INDEX를 사용하기 위한 REQUIREMENT

1) INDEX를 생성한 후 테이블의 통계정보를 생성해야 한다.

2) NULL은 인덱스에 저장되지 않기 때문에 표현식에서 NULL 값을 사용할 필요가 없어야 한다.

4.DETERMINISTIC Functions

FUNCTION BASED INDEX에서 사용하는 사용자 정의함수는 DETERMINISTIC Keyword를 가지고 선언되어야 FUNCTION BASED INDEX에서 사용되어질 수 있다.

옵티마이저가 사용자 정의함수를 수행하지 않고 이전에 계산된 값을 사용하기 위해서는 함수가 제한된 방식으로 행동해야만 안전할 수 있다. 즉 함수는 어떤 입력 값에 대하여 항상 같은 값을 반환해야 한다는 것이다. DETERMINISTIC Keyword는 함수가 이러한 방식으로 행동한다는 것을 보장해 준다.

 


728x90