2017-04-20 5 views
0

이름이 t (abc varchar2 (50), xyz varchar2 (50), ..etc)이고 abc 열에서 색인이 활성화 된 테이블이 있습니다. 오라클은 userfunction(a)에 대한 색인을 사용하는데 오랜 시간이 걸립니다. 이것은 동적 쿼리가 abc에 인덱스를 사용해야하는 다른 조건을 가질 수 있으므로 no_index 힌트를 사용하고 싶지 않습니다. SQL 쿼리에서 함수 호출에 대한 색인이 없습니다.

select *from t 
where 
userfunction(a) = 0 
and exists (select 1 from tab where t.abc='' ...etc) 
and ..etc 

는 I 중첩 조회하는 기능을 이동하여 중첩 쿼리 질의를 재 작성했지만, 오라클 재기록 여전히 처음 userfunction(a)을 실행하고 쿼리는 많은 시간이 소요된다.

select *from (
    select *from t 
    where 
    and exists (select 1 from tab where t.abc='' ...etc) 
    ..etc 
    ) 
userfunction(a) = 0 

또한 WITH 절을 사용했지만 운이 없다.

oracle은 사용자 함수 호출이나 where 절의 특정 조건에 대해 인덱스를 사용하지 않으려합니다.

+0

사용자 기능이란 무엇입니까? –

+2

'userfunction (a)'또는'userfunction (abc)'? 오라클이 데이터에 액세스하기 위해 인덱스를 사용한다는 것이 문제는 아니라고 생각합니다. 그러나 아마도 더 적절한 색인을 사용할 수있을 것입니다. 그것은 전체 질의를 보는 것을 도울 것입니다. 또한 :'userfunction'은 결정적입니다 (즉, 내년에는 같은 값으로 동일한 결과를 얻을 것인가?). –

+0

userfunction (abc)입니다. 결정적이지 않습니다. 기본적으로 매우 값 비싼 함수이므로, 마지막과 절에서만 호출되기를 바랍니다. – user1181858

답변

0

쿼리가 논리적으로 일관성이 없습니다. 테이블과 탭을 참조하지만 테이블 만 설명합니다. 탭을 작성할 때 t를 의미한다고 가정 할 때 하위 쿼리와 함께 exist 절이 필요한 이유를 알 수 없습니다. EXISTS는 subselect의 표현식이 TRUE 일 때 TRUE를 리턴합니다. 왜 t를 메인 쿼리에서 그 표현식을 사용하지 않을까요?