그냥 갑자기 궁금해진 조인 문제. 0 6 1,104

by 김중선 [2010.11.24 18:09:14]


SELECT   A.CODE, A.DATE
,        A.AMT
,        NVL(B.AMT,0) B_AMT
FROM     SELECT   CODE, DATE
                 ,        SUM(AMT)       AMT
             FROM    테이블1
             WHERE    DATE   BETWEEN '20101101' AND '20101131'
             AND      CODE = '0001'
             GROUP
             BY       CODE, DATE
         )   A
,        (    SELECT   CODE, DATE
             ,        SUM(AMT)    AMT
             FROM     테이블2
             WHERE    DATE   BETWEEN '20101101' AND '20101131'
             AND      CODE = '0001'
             GROUP
             BY       CODE, DATE
         )   B
WHERE    B.CODE(+)  =   A.CODE
AND B.DATE(+)   =   A.DATE
ORDER
BY       A.CODE, A.DATE


위처럼 해쉬조인 되는경우.
WHERE 조건을

1.
WHERE    B.CODE(+)  =   A.CODE
AND B.DATE(+)   =   A.DATE

2.  
WHERE   B.DATE(+)   =   A.DATE


전 보통은 멀 조인 하든 습관적으로 1번처럼 조인해야하는걸 모두 하는 편인데
위와 같은 경우 이미 각 A와 B가 WHERE 조건에서 CODE가 '0001'로 조회되어서 
2번처럼 해도 값은 같겠죠? ㅋ

속도차이는 없을까요?
혹시 1번이 더 느리진 않을지?

그냥 궁금해서요. ㅎㅎ
by 현 [2010.11.24 18:15:34]
일반적인 경우라면 쿼리 변형이 일어나서 1번이나 2번이나 동일하게 적용 됩니다.
그러나 그렇지 않을 경우도 있을 수 있지 않을까 하는 막연한 생각이 드네요..

그래서 저같으면 1번의 방법을 선택하시라 권하고 싶습니다.
그런데 정확히 저런 경우라면 굳이 쿼리를 저렇게 스칼라서브쿼리로 만들 필요가 있는지도 의문이긴 합니다..

그냥 궁금해서 올리신거죠?
실제로는 저렇게 쿼리 안짜시는거죠??

by 김중선 [2010.11.24 18:33:19]
그냥 궁금해서이기도 하고,
실제로 쫌 지저분한 복수형 서브 쿼리들로 만들어진 쿼리의 일부분입니다.
건들지는 못하는 소스인데,
그냥 갑자기 정렬도 안되있고 인덱스도 안타는 저런 서브쿼리의 해쉬조인 되버리는경우
그냥 보기에는 필요없는 B.CODE(+) = A.CODE가 어떤 영향을 미칠지;;;;

퇴근이 7시인데 갑자기 심하게 나른하고 궁금해서 끄적인겁니다.

답변감사합니다.

머리 식히고 일 마무리 하고 가야겠네요.

by 김중선 [2010.11.24 18:35:00]
조인의 세계는 항상 궁금한게 많아요~ ㅋㅋㅋ

by 마농 [2010.11.25 08:40:11]
해쉬조인되는 것은 실행계획 확인하시고 말씀하시는 거 맞나요?
해쉬조인을 탔다고 해서 좋다? 나쁘다? 를 판단하는것이 아닙니다.
위의 두 집합간의 조인은 인덱스 안타는게 오히려 당연한 거구요.
그룹바이를 사용한 집합끼리의 조인이기 때문이죠.
오히려 인덱스가 필요한 부분은 조인이 아니라 검색입니다.
즉, 서브쿼리 안에서의 검색을 위해 인덱스가 필요하죠.
코드 + 날짜 인덱스가 있다면 아주 적절하겠네요.

by 잽 [2010.11.26 11:13:24]
서브쿼리는 눈을 싯고 찾아봐도 없는데요..;;
인라인뷰~겟죵

by 마농 [2010.11.26 11:29:58]
마름모, 정사각형, 직사각형, 사다리꼴 은 모두 다 사각형이죠.
시각형은 도형이구요.
인라인뷰도 마찬가지로 서브쿼리입니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입