2017-12-12 7 views
1

다음 쿼리는 때때로 실행 계획에서 병합 데카르트 조인으로 이어지며 병합 데카르트 조인이 더 이상 발생하지 않도록 쿼리를 다시 작성하려고합니다 (가장 간단한 방식으로). 비슷한 질문을 검토 한 후오라클 실행 계획에서 병합 데카르트 조인을 피하는 방법?

SELECT COL1 
FROM SCHEMA.VIEW_NAME1 
WHERE DATE_VAL > (SELECT DATE_VAL FROM SCHEMA.VIEW_NAME2) 

는 "Why would this query cause a Merge Cartesian Join in Oracle는"문제가 오라클이 그 (SCHEMA.VIEW_NAME2 FROM DATE_VAL를 선택)을 알지 못한다 "것 같다 하나 개의 결과를 반환합니다. 많이 생성하는 것으로 가정 그래서 "

오라클 옵티 마이저에게 서브 선택이 한 행만 리턴 할 것이라고 말하는 방법이 있습니까?

최적화 프로그램이 함수가 하나의 값만 반환 할 수 있다는 것을 알고 있다고 가정하면 하위 선택 도움말 대신 datetime 값을 반환하는 함수를 사용합니까?

SELECT COL1 
FROM SCHEMA.VIEW_NAME1 
WHERE DATE_VAL > SCHEMA.FN_GET_DATE_VAL() 

는 오라클 DBA는 작동 할 것 같아 문,와를 사용하여 권장하지만, 어떤 짧은 옵션이 있다면 우리는 궁금했다. 서브 쿼리는 (대부분에서) 하나 개의 행을 반환하기 때문에 나는 데카르트에 대해 걱정하지 것이다

with mx_dt as (SELECT DATE_VAL FROM SCHEMA.VIEW_NAME2) 
SELECT COL1 
FROM SCHEMA.VIEW_NAME1, mx_dt a 
WHERE DATE_VAL > a.DATE_VAL 
+1

'SELECT MIN (DATE_VAL) FROM VIEW_NAME2'와 같은 하위 선택에서 그룹 기능 사용 – Glenn

답변

0

은 가입 할 수 있습니다. 그렇지 않으면 "하위 쿼리가 너무 많은 행을 반환합니다"라는 오류가 발생합니다.

오라클은 각각의 비교에 대해 한 번씩 하위 쿼리를 실행하지만 가능하면 오라클 옵티마이 저는 영리하며 문제가 발생할 수 있습니다. 그러나,이 JOIN으로이 구절 충분히 쉽다 그러나

SELECT n1.COL1 
FROM SCHEMA.VIEW_NAME1 n1 JOIN 
    SCHEMA.VIEW_NAME2 n2 
    ON n1.DATE_VAL > n2.DATE_VAL; 

, 당신이 n2 만 (대부분에서) 반환하도록되어 있음을 지정하지 않았기 때문에이 실행 계획은 더 나쁜 것을 일 수 있습니다 값.

+0

하이 고든 안녕하세요. 조회수는 매우 적습니다 (1000 건의 레코드). –

0

하위 선택의 집계 함수는 단일 행이 반환되도록합니다. 아마도 옵티 마이저에 대한 좋은 힌트 일 것이고 VIEW_NAME2에 1 행만있는 경우 하위 선택의 결과는 같습니다.

SELECT COL1 
    FROM SCHEMA.VIEW_NAME1 
    WHERE DATE_VAL > (SELECT MIN(DATE_VAL) FROM SCHEMA.VIEW_NAME2) 
0

시도 WHERE ROWNUM >= 1 추가 :

SELECT COL1 
FROM SCHEMA.VIEW_NAME1 
WHERE DATE_VAL > (SELECT DATE_VAL FROM SCHEMA.VIEW_NAME2 WHERE ROWNUM >= 1) 

그 술어가 완전히 외부 보이는, 또는 것은 오라클의 종류 그냥 무시합니다,하지만 ROWNUM 의사 기능은 특별하다. 오라클은 "이 행을 순서대로 반환해야하며 어떤 쿼리 변환도하지 않는 것이 좋습니다"라고 생각합니다. 즉, 조건자를 밀어 넣거나보기를 합치려고하지 않는다는 의미입니다. 즉, VIEW_NAME1이 (가) VIEW_NAME2와 (과) 별도로 실행되며 이제는 이전과 마찬가지로 빠르게 실행됩니다.

설명 플랜에서 Cartesian 제품을 볼 수는 있지만 두 개의 뷰 결과 세트 사이의 맨 위에있는 것이 좋을 것입니다. 실제로 행이 하나만 반환되면 데카르트 제품이 올바른 연산 일 것입니다.