함수기반 인덱스 (function-based index or functional index)
select * from prod where cnt * price between 300 and 320
create index prod_idx1 on prod (cnt * price)
특징
테이블의 컬럼들을 가공한 논리적 컬럼을 인덱스로 생성한것
INDEX column의 변형에 유연하게 사용할 수 있는 인덱스
- 함수나 수식의 결과로 B*Tree 또는 Bitmap 인덱스 생성
옵티마이저가 쿼리를 파싱하면서 FBI 의 사용 가능여부를 판단
검색효율 향상을 위해 효과적이나 FBI 구성컬럼에 대한 빈번한 입력 , 수정은 부하가중
SQL 문에 사용된 Expression 을 Parsing 하여 일치하는 Expression 을 찾고 Expression Value 를 비교하여 Expression Value 에 대해 Case-Sensitive 함
Dictionary View 에서 index Column 정보 확인 가능
제약사항
사용자 지정함수는 Deterministic 로 선언
Query_rewrite_enabled = true
Query_rewrite_integrity = trusted
필수 권한 : index create / any index create / query rewrite / global query rewrite
함수나 수식의 결과과 NULL 인 경우 사용하지 않음
사용자 지정 함수 재정의 시 --> Disabled or 변경전 함수 유지
owner 의 execute 권한이 revoke 되면 사용불가
disabled 된 인덱스를 사용하려 하면 SQL 은 실패
- ALTER INDEX .. ENABLE /ALTER INDEX ... REBUILD
- ALTER INDEX ... UNUSABLE <-- SKIP_UNUSABLE_INDEXES = TRUE 필수
FBI 와 사용자 지정 함수
다른 테이블을 참조하는 사용자 지정함수를 적용한 함수기반 인덱스에서 참조 테이블에 변화가 생긴다면?
1) 참조테이블의 데이터가 변경되면 함수기반 인덱스를 사용하지 못하도록 disabled 시킨 후 수 작업으로 인덱스를 재생성한다
2) 참조테이블의 데이터가 입력,갱신 또는 삭제가 발생하면 모든 함수기반 인덱스를 수정한다 (적용불가)
3) 참조테이블의 데이터 변경을 불허한다 (적용불가)
3) 참조테이블의 데이터 변경이 일어나더라도 함수기반 인덱스의 데이터는 변경시키지 않는다.
거의 변경이 일어나지 않는 코드성 테이블을 참조하는 함수 기반 인덱스는 필요에 따라 적용 가능하나 일반 테이블을 참조하는 함수 기반 인덱스는 권장하지 않는다.
댓글 없음:
댓글 쓰기