2016-11-17 4 views
4

내 PL/SQL에서 바인드 변수를 사용하여이 큰 동적 SQL을 사용하십시오. DBMS_SQL 패키지를 사용하여 생성 된 쿼리를 바인드하고 실행합니다.LIKE % 연산자를 사용하여 바인드 변수를 사용하십시오.

특정 기준에 따라 where 절이 동적 SQL에 추가됩니다. 방금 ""또는 "="를 사용하여 바인드 변수를 모두 일치 시키면 모두 잘 작동하고 결과가 매우 빨리 반환됩니다.

예 : 내가 할 때

그러나

(servedparty = :bv_ or servedpartyimsi = :bv_)

, 다음

(servedpartyimei like :bv_) 

및 쿼리가 매우 매우 매우 긴 시간이 소요 1백23억4천5백67만9천8백90퍼센트 같은 값을 제공합니다.

나는 또한 '%'없이 값을 제공하지만 바인딩 변수없이 쿼리를 실행할 때이 같은 결과

을 제공합니다 다음이

(servedpartyimei like :bv_||'%')

과 같은 somehting을 시도했지만 하드 코드 된 값을 넣으면 결과가 즉시 반환됩니다.

여기 뭔가 잘못 되었나요? LIKE 연산자와 같은 변수를 바인드하지 않습니까? 아이디어가 있으십니까?

감사합니다.

+1

'servepartyimei'는 어떤 데이터 유형입니까?검색 값을 숫자로 표시했습니다 (IMEI가 맞는 것 같습니까?)하지만 문자열로 취급하고 있습니다. 또한 사용중인 Oracle 버전을 알려줄 필요가 있습니다. 빠르고 느린 버전의 실행 계획을 살펴볼 수 있습니까? –

+0

imei는 데이터베이스에 문자열로 저장됩니다. 데이터베이스 버전은 11.2 – Tijs

+2

입니다. 실행 계획을보고 싶다면 여전히 실행 계획을 살펴볼 필요가 있습니다. 아마도 다른 것으로 생각되는 (색인 된) 열에도 필터가 있거나 다른 이유로 예상되는 인덱스를 사용하지 않는 것일 수 있습니다. 우리는 그것이 무엇을하고 있는지 실제로 추측 할 수 없습니다. 알아 내야합니다. –

답변

4

난 당신이 오라클 버그 9197434으로 고통 받고

는 지금까지 내가 아는 한, 그 고정되지 않은 (BIND가 DBMS_SQL을 사용하면 안될 엿보기) 생각합니다.

바인드 변수 엿보기의 이점이 없으면 오라클은 LIKE 조건의 오른쪽에 어떤 값이 있는지 알지 못합니다. 예를 들어 '%'일 수도 있습니다. 따라서 오라클은 일반적인 바인드 변수 값인 LIKE의 행 수를 가정합니다. 이러한 가정은 매우 보수적이며 오라클이 원하는 빠른 계획 (인덱스 사용 가능성)에서부터 느린 계획 (해시 조인 사용 가능성)에 강요 할 가능성이 있습니다.

가능하면이 버그로 인하여 Native Dynamic SQL (즉, EXECUTE IMMEDIATE)을 사용하는 것이 좋습니다. 그렇지 않으면 SQL을 힌트해야 할 수도 있습니다.

+1

동일한 버그의 11.2 버전은 버그 # 13386678 (BIND PEEKING은 DBMS_SQL에서 작동하지 않습니다)입니다. 오라클은이 버그를 "해결할 수 없다"고 발표했다. 따라서 해결 방법이 필요합니다. –

3

LIKE를 바인드 변수와 함께 사용하는 경우 일부 구형 버전에서는 일치하는 행 수를 가정해야합니다. 어떤 값을 선택했는지 기억하지 못합니다 (버전에 따라 다를 수 있음). 5 %, 10 % 일 수 있습니다. 이제 이것이 현실과 일맥 상통 할 수 있으며 빈약 한 계획으로 이어질 수 있습니다.

이름에서 알 수 무엇을하지 _like_with_bind_as_equality라는 문서화되지 않은 (및 지원되지 않는) 최적화 매개 변수가 있습니다 - 즉 truecolumn like :bv에 의해 반환되는 행의 수를 column = :bv에 의해 반환되는 것과 동일한 것으로 가정 설정할 때. 그래서 당신이 그것을 사용하면 더 빠른 계획을 얻을 수 있습니다. alter session을 통해 설정할 수 있습니다.

+0

와 점검 할 예정이지만 불행하게도 아무런 효과가 없습니다. – Tijs