롤업 관련 질문 드립니다. 0 3 2,002

by 제로 [2012.11.28 14:08:21]


밑에 풀텀님께서 올리신 롤업 질문을 보고 몇가지 테스트 하다가 궁금한점이 생겨 문의 드립니다.
질문 : logical 옵티마이저의 쿼리변환이 /*+ no_merge */ hint의 영향으로 최종 결과 집합이 다를 수가 있나요?
제가 테스트 한 경우에는 아래와 같습니다.(scott 계정의 emp 테이블 사용했습니다.)
-- no_merge 힌트를 사용하지 않은 경우
select /*+ leading(v0) use_hash(v1) */ *
from (select deptno, max(sal)
      from scott.emp
      group by rollup(deptno)) v0
    , (select 20 deptno from dual) v1
where v0.deptno = v1.deptno(+);
-- 결과건수 3건
-- no_merge 힌트를 사용했을 경우
select /*+ leading(v0) use_hash(v1) */ *
from (select deptno, max(sal)
      from scott.emp
      group by rollup(deptno)) v0
    , (select /*+ no_merge */ 20 deptno from dual) v1
where v0.deptno = v1.deptno(+);
-- 결과건수 4건

두 결과가 서로 다르게 나오는데요...
이러한 결과가 정상적인 것인지 궁금하여 문의 드립니다.
by 마농 [2012.11.28 18:16:17]

정말 그렇게 나오네요..
쿼리트랜스포메이션의 기본 수칙을 어겼네요.
쿼리 결과가 동일해야 한다는 기본 수칙을 어긴 쿼리변환이므로 잘못된 쿼리변환이네요.
비정상입니다. 버그라고도 하지요.


by 마농 [2012.11.28 18:19:12]

조인 방식에 문제가 있는건 아닌것 같습니다.
실행계획상 Outer Join 이라고 표시가 되네요.
잘못된 부분은 rollup 오퍼레이션이 아예 빠져버리는게 문제인듯 하네요.


by 제로 [2012.11.28 18:46:30]
아~ 답변 감사합니다. 많은 도움 되었습니다.^^ 
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입