2016-06-29 6 views
0

내가이 쿼리를이 곳에서 함수와 성능을 향상되지 않습니다지수는 절

select col1,col2, x.id pk 
/*+ INDEX (some_index_on_col4)*/ 
from tbl1 y 
,tbl2 x 
where col2 = 'some_value' and col3 = 'U' 
and x.col4 = dbms_lob.substr(REPLACE(y.PK_DATA,'"',''), 100, 1) 
; 

쿼리가 매우 느립니다, 나는 계획을 설명 할 때, 인덱스가 사용되지 않음을 보여줍니다 그러나 전체 테이블 스캔 내가

dbms_lob.substr(REPLACE(y.PK_DATA,'"',''), 100, 1) 

를 제거하는 경우, 대신 사용하고 말을한다 대신

x.col4 = 3456 

이 잘 작동하고, 어떻게 향상시킬 수 있습니까?

N.B. : TBL2이 분할

+0

당신은 또한 실행 계획을 게시 할 수 있습니다 사용 두 쿼리에 기재 한 바와 같이 [여기] (http://stackoverflow.com/questions/34975406/how-to-describe-performance-issue-in-relational-database?answertab=active#tab-top) –

+1

당신이 그것을 변경하는 경우 'x.col4 = 3456'으로 변경하면 오라클은 관심있는 x.col4 값 (3456)이 하나뿐이므로 명확하게 색인을 사용할 수 있음을 알고 있습니다. 'dbms_lob.substr (REPLACE (y.PK_DATA, ' "', ''), 100, 1)'을 선택하면 여러 x.col4 값이 선택 될 수 있습니다. 옵티마이 저는 전체 스캔이 바람직하다고 결정할 수 있습니다. –

+0

실제로 일치하지 않았으므로 전체 스캔이 어떤 식 으로든 수행되었으므로 인덱스가 사용되지 않은 이유입니다 ... 그러나 일치하는 것이 있으면 인덱스가 사용됩니다. –

답변

0

실제로 일치 없었다 그것은 전체 검사가 어떤 방식으로 수행되었을 때 인덱스를 사용하지 않은 이유는 ...하지만 경기가있을 때, 인덱스가

1

하나 개 명백한 차이 ( 인덱스를 사용하지 offen의 원인) dbms_lob.substr(REPLACE(y.PK_DATA,'"',''), 100, 1)의 결과 VARCHAR 아닌 NUMBER3456 같은 점이다.

가능한 경우 to_number으로 변환하십시오.

그러나 이것은 일정한 편이므로 3456과 동일한 계획을 세우지 않습니다. 원래 쿼리는 y.PK_DATA을 사용합니다.

+0

감사합니다, 조금 도와 줬지만 실행 계획은 여전히 ​​인덱스를 사용하지 않고 전체 스캔을한다고 말합니다. –