2013-03-11 3 views
1

안녕하세요 :) 성능 문제에 대해 중첩 된 쿼리가 중첩되어 있어야한다는 것을 이해해야합니다.Oracle의 SQL : 중첩 된 쿼리의 재구성 중지

SELECT * FROM (
    SELECT 
    UTL_MATCH.JARO_WINKLER_SIMILARITY(clients_me.address, clients_them.address) jw, 
    clients_them.*, 
    clients_me.* 
    FROM clients_them JOIN clients_me ON clients_me.email = clients_them.email 
) WHERE jw > 80 

성능이 괜찮 마지막 WHERE jw > 80없이 : 여기

는 쿼리입니다. 나의 이해는 오라클이 JARO_WINKLER_SIMILARITY를 중첩 된 쿼리 내부의 조인에 추가하려고 시도한다는 것이다. 나는 나쁜 성냥을 걸러 내고 싶다.

안부

+0

하는 경우에만 응용 프로그램에서 상위 N 행을 선택하는 :
다음과 같이 힌트를 추가보십시오? 이러한 유형의 변경으로 인해 처음 N 개의 행이 더 빨리 반환 될 수 있지만 전체 데이터 집합을 검색하는 속도는 느리거나 나 빠집니다. –

+0

쿼리에서 JARO_WINKLER_SIMILARITY를 제거하고 client_them. * 및 clients_me. *에 처음 참여하는 방법을 확인하십시오. ... ... – Art

+0

어, 성능상의 이유로 저장된 proc 파일의 사용을 살펴 보겠습니다. 결국 모든 단일 행에 대해 무언가를 계산해야한다면 옵티마이 저가 할 수 있습니다. 아마도 다른 레벨을 중첩 할 것입니까? 또한 [범위가 0에서 1까지 인 것 같습니다] (http://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance), '80 '을 올바르게 사용했는지 확인하십시오 (예 : , 나는 십진법을 사용하고있을 것인가?) –

답변

1
당신은 NO_QUERY_TRANSFORMATION, 아니면 NO_PUSH_SUBQ 또는 NO_MERGE과 같은 몇 가지 힌트를 넣어 시도 할 수

. (저는 힌트를 가진 전문가가 아니며, 대부분의 경우 그것을 피하는 것이 좋다고 생각합니다.)

http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements006.htm#BABCGJDI

그러나 IMHO, 할 수있는 가장 좋은 방법은 예상대로 일이되지 알 것이다, 그래서 당신의 실행 계획 나쁜 성능 쿼리를 얻을 수있을 것이다.

+0

답변 해 주셔서 감사합니다 :). 나는 이러한 힌트 (귀하의 링크에서 다른 사람)의 다양한 조합과 위치를 아무 소용이 시도했다. 아무도 내가 원하는 방식으로 행동하는 신탁을 멈추지 않을 것입니다. 나는 임시 테이블을 만드는 것으로 끝을 맺었다. 이것은 올바른 일은 아니지만 오라클을 올바른 힌트로 행동하게 만들 수 있다고 깊이 믿으므로 답변을 확인하고 있습니다. – BenoitParis

1

Push_pred/no_push_pred : 쿼리에 no_merge 힌트로 인해 병합 불가 뷰가있는 경우 다른 테이블에서 조인을 어떻게 조작해야합니까? 하나의 큰보기 결과를 작성하여 한 번 결합 (no_push_pred)하거나 조인 술어를 뷰 정의로 밀어 넣고 다른 테이블 (push_pred)에서 모든 구동 행에 대한보기 결과 세트를 다시 작성해야합니다.

no_merge에 대해서만 push_pred vailid를 의미합니다.

/*+ no_merge(y) no_push_pred(y) */