2017-11-21 18 views
1

다음 SQL 매우 느립니다. 그러나, 그것은 SQL은 두 커서에 쓸 때 몇 초 단지 문제 즉오라클 서브 쿼리의 SELECT MAX()는

CURSOR GetMaxValue IS 
    SELECT MAX(p.Session_ID) 
     FROM Clone_Db_Derective p 
     WHERE p.Date = trunc(sysdate) 
     AND p.Regularity = 'THEME' 

    CURSOR GetAllItems(temp VARCHAR2) IS 
    SELECT * 
    FROM Transaction_Auth_Series t 
    WHERE t.Auth_ID = temp; 

........ 
    FOR item in GETMAX LOOP 
    FOR itemx in GETITEMS(item.aaa) LOOP....... 

테이블이 관련되지 않은 것처럼 작동하지 않습니다 결합합니다. 위의 주 SQL을 어떻게 최적화 할 수 있습니까? 이 쿼리

+0

아마도 실행 계획이 최적이 아닐 수도 있습니다. 예를 들어, 옵티마이 저는 테이블 통계를 기반으로 먼저 조인을 수행하기 위해 내부적으로이를 변환했습니다. 그렇다면 통계를 수정하거나 검색어를 재정렬하거나 힌트를 표시 할 수 있습니다. –

+0

@ 윌리엄 로버트슨의 제안을 자세히 설명해 주시겠습니까? – MaDi

+0

실행 계획이 이와 같은 간단한 쿼리에 좋지 않은 경우 일반적으로 통계가 잘못되었음을 의미합니다. 따라서 SQL 튜닝 연습에는 계획을 확인하고 통계를 검토하는 작업이 포함됩니다. 어떻게 보이나요? –

답변

0

:

SELECT t.* 
FROM Transaction_Auth_Series t 
WHERE t.Auth_ID = (SELECT MAX(p.Session_ID) 
        FROM Clone_Db_Derective p 
        WHERE p.Date = trunc(sysdate) AND p.Regularity = 'THEME' 
       ); 

나는 Clone_Db_Derective(Regularity, Date, Session_ID)Transaction_Auth_Series(Auth_Id)에 인덱스를 추천 할 것입니다.

이 쿼리에 대한 최적화 (테이블이 뷰가 아니라고 가정)는 매우 단순 해 보입니다. 나는 커서 버전이 훨씬 더 빠르다는 것에 놀랐다. 절을

+0

예, 커서 버전이 몇 초 내에 필요한 데이터를 검색합니다. 그러나 Transaction_Auth_Series는 뷰이고 Clone_Db_Derective는 인덱싱됩니다. – MaDi

+0

@MaDi. . . 뷰가 옵티 마이저를 혼동시킬 수 있습니다. 하위 쿼리를'FROM' 절로 이동시키고'JOIN'을 사용해보십시오. –

+0

제안 해 주셔서 감사하지만 조인이 도움이되지 않습니다. 이것들은 관련이 없으므로 확실히 도움이되지 않을까요? – MaDi

0
WITH max_session 
    AS (SELECT MAX (p.Session_ID) id 
      FROM Clone_Db_Derective p 
      WHERE p.Date = TRUNC (SYSDATE) AND p.Regularity = 'THEME') 
SELECT * 
    FROM Transaction_Auth_Series t 
WHERE t.Auth_ID = (SELECT id FROM max_session) 

A는 하나의 평균 곳 값이 두 개 또는 세 번 비교 될 필요로 쿼리의 결과는 메인 쿼리의 본문에 한 번 이상 필요할 때 가장 중요합니다. 요점은 단일 쿼리로 여러 번 결합 된 테이블에 대한 액세스 수를 최소화하는 것입니다.

+0

나는 WITH를 시도했지만 성공하지는 못했다. 여전히 많은 시간이 걸립니다 (CURSOR 옵션은 약 2 초만 소요되는 반면 약 160 초) – MaDi

+0

OP의 전체 쿼리에서 하위 쿼리가 한 번만 사용된다는 것이 핵심입니다.이 경우 옵티마이 저가 OP의 원래 쿼리로이 응답을 변환하기 때문에 WITH 절이 아무 것도 변경하지 않는 것을 볼 수 있습니다. – mathguy