다음 쿼리는 때때로 실행 계획에서 병합 데카르트 조인으로 이어지며 병합 데카르트 조인이 더 이상 발생하지 않도록 쿼리를 다시 작성하려고합니다 (가장 간단한 방식으로). 비슷한 질문을 검토 한 후오라클 실행 계획에서 병합 데카르트 조인을 피하는 방법?
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
'SELECT MIN (DATE_VAL) FROM VIEW_NAME2'와 같은 하위 선택에서 그룹 기능 사용 – Glenn