2012-07-24 2 views
3

처음으로 사용자 정의 함수에서 함수 기반 인덱스를 사용하고 있습니다. 인덱스를 사용할 수없는 경우 성능 문제가 발생했습니다.인덱스 액세스를 사용하지 않을 때 함수 기반 인덱스

내부적으로 함수 기반 인덱스는 내 함수가 varchar2를 반환하므로 숨겨진 테이블 열 (varchar2 (4000) 유형)을 생성하고 색인을 생성하는 것으로 보입니다. 인덱스가 사용될 때 제대로 작동하지만 필터로 함수를 사용하여 전체 테이블 스캔을 수행해야하는 경우가 있습니다.이 경우 필자는 6의 성능 저하를 봅니다.이 경우 Oracle은 사용하지 않습니다 숨겨진 열이 있지만 각 행에 대한 함수를 다시 계산하면 IO 바인딩 대신 CPU 바인딩이 수행됩니다.

오라클이 숨겨진 열을 필터링에도 사용할 수있는 방법이 있습니까? 내가 그 라인을 따라 몇 가지 재 작성 옵션이나 뭔가를 놓치고 있는지 궁금해.

그렇지 않은 경우 열을 직접 정의하고 트리거를 사용하여 최신 상태로 유지해야합니다. 투명성과 유지 보수 용이성을 위해 함수 기반 색인을 사용하는 것이 더 좋습니다.

+1

"숨겨진 열"이 테이블 자체에 저장되지 않았기 때문에 까다로울 것입니다. 색인을 구성하는 요소입니다. 테이블 스캔 중에는 사용할 수 없습니다. 오라클이 사전 계산 된 데이터를 얻기 위해 인덱스를 통과해야합니다 (또는 적어도 어떻게 든 결합하십시오). – Thilo

+0

컬럼이 실제로 존재하지 않는다면, 나는 두 세계에서 최고를 가질 수 없다는 것이 분명합니다. 방금 dba_tab_cols를보고 _real_, 숨겨진 열이 있다고 생각했습니다. 색인을 작성하기위한 가상 구조 일 뿐이므로 내 질문에 대한 대답입니다. 즉, 검색을위한 실제 열이 필요합니다. – Chris

+0

글자 그대로, 인덱스 * 안에 구체화 된 형태로 존재한다는 것이 현실입니다. 즉, 계산 된 데이터가있는 정의 인 가상 열과는 달리 뷰의 파생 열과 동일합니다. – Thilo

답변

0

테이블 스캔에서 함수 기반 인덱스를 사용할 수있는 일반적인 방법은 없습니다.

내가 내 질문에 만든 가정, 즉 단순히 잘못 "내부적으로 함수 기반 인덱스는 ... 숨겨진 테이블 열을 생성하는 것 같다"함수의 결과는 이 저장되지 않습니다 테이블 열은 인덱스에만 있지만

검색을 수행 할 때 색인에 액세스 할 수있는 방법이 없으면 (키 열로 시작하는 조합 된 색인 인 경우에만 생각할 수있는 유일한 방법입니다) 사전 계산 된 결과는 사용하십시오.

11g "가상 열"기능은 열이 테이블에 저장되지 않고보기에 함수를 사용하는 것과 비슷한 방식으로 즉석에서 계산되므로 도움이되지 않습니다.

요약 : 테이블 스캔을 배제 할 수없고 함수 호출이 비용이 많이 드는 (느린) 경우 "삽입 또는 업데이트 전"트리거와 함께 실제 열을 사용하십시오. 함수 기반 인덱스는 수행하지 않습니다.

(참고 : 답변을 추가하지 않았으므로이 답변을 추가했습니다.답의 크레딧은 thilo에 속하며, 칼럼이 구체화되지 않았다고 지적했습니다.

3

사용중인 Oracle 버전은 무엇입니까? 11g이라면 using a virtual column을 시도해야합니다. 이것은 값이 표현식이나 리터럴에서 파생 된 열입니다. 테이블의 일부로 정의되므로 함수 기반 인덱스와 달리 테이블 DESC에서 가시성을 갖습니다. 가상 열에 인덱스를 만들 수 있습니다. 또한 트리거가 필요없이 자동으로 유지 관리됩니다.

따라서 함수 기반 인덱스와 동일한 표현식을 사용하여 테이블에 가상 열을 추가 할 수 있습니다. 아마도 다음과 같습니다.

create table t23 
    (id number 
    , col_a varchar2(10) 
    , vcol_a as (upper(substr(col_a, 1, 1))) 
) 
/

가상 열을 삽입하거나 업데이트 할 수 없습니다. 그래서 당신은 삽입 문의 투사를 지정해야합니다

insert into t23 (id, col_a) values (1, 'this is a test'); 

그런 다음 가상 컬럼에 일반 인덱스를 구축 할 수 있습니다 :

create index t23_vc_i on t23(vcol_a) 
/

함수 기반 인덱스를 삭제하는 것을 잊지 마세요!

+0

불행히도 대부분의 고객은 여전히 ​​10g을 사용합니다. 하지만이 기능을 내 관심에 가져 주셔서 감사합니다. 함수 기반 인덱스에 의해 암시 적으로 사용되는 varchar2 (4000)가 약간 문제가 있음을 알았 기 때문에이 열의 형식을 지정할 수 있습니다. (substr-workaround가 너무 편한 것 같습니다.) – Chris

+0

그러나 가상 열은 구체화되지 않습니다. 따라서이 값은 즉석에서 계산되기 때문에 CPU 병목 현상이 완화되지 않습니다. 인덱스를 작성하는 것은 현재 제자리에있는 함수 인덱스와 동일합니다. – Thilo