안녕하세요. 언제나 구루비 사이트를 눈팅하며 SQL의 신세계를 경험하고 있는 개발자입니다.
좋은 질문 주시는 분들,그리고 답변 주시는 분들 항상 감사합니다.
다름이 아니라 제가 질문드리고 싶은 내용은 제목과 같이
두 테이블 선 UNION ALL 후 JOIN? vs 선 JOIN 후 UNION ALL? 가 맞는건지
아니면 이런 경우 다른 방법이 있는건지 궁금해서 질문드립니다.
기본 테이블 상황은 아래와 같습니다.
TABLE_A 300만건 적재
TABLE_B 1만건 적재
T_MONEY_MSTR 50건 적재
T_PJT_MSTR 5천건 적재
조회 시간 평균 6~10초
Oracle DB 아님
인 상황에서 다른 용도의 TABLE_A,, TABLE_B에서 공통 정보를 추출하여
통계 정보를 내야 하는 상황입니다.
근데 아래 CASE1, CASE2를 두고 어느게 이 상황에서 맞는건지 모르겠습니다.
아니면 이런 경우 다른 방식으로 접근을 해야하는 건가요?
예시 쿼리
WITH TABLE_A AS ( SELECT '201501' YM, 'P100' PJT_CD, 'SALARY' MONEY_TCD, 1000 AMT FROM DUAL UNION ALL SELECT '201501', 'P200', 'SALARY' , 2000 FROM DUAL UNION ALL SELECT '201501', 'P400', 'SALARY' , 3000 FROM DUAL UNION ALL SELECT '201501', 'P500', 'SALARY' , 2000 FROM DUAL UNION ALL SELECT '201501', 'P600', 'SALARY' , 3000 FROM DUAL UNION ALL SELECT '201501', 'P700', 'BONUS' , 100 FROM DUAL ) , TABLE_B AS ( SELECT '201501' YM, 'P100' PJT_CD, 'SALARY' MONEY_TCD, 1000 AMT FROM DUAL UNION ALL SELECT '201501', 'P200', 'SALARY', 2000 FROM DUAL UNION ALL SELECT '201501', 'P300', 'SALARY', 3000 FROM DUAL UNION ALL SELECT '201501', 'P100', 'BONUS' , 100 FROM DUAL UNION ALL SELECT '201501', 'P100', 'OTHER' , 3000 FROM DUAL UNION ALL SELECT '201501', 'P200', 'BONUS' , 1000 FROM DUAL UNION ALL SELECT '201501', 'P300', 'BONUS' , 1000 FROM DUAL UNION ALL SELECT '201502', 'P100', 'SALARY', 1000 FROM DUAL UNION ALL SELECT '201503', 'P100', 'SALARY', 1000 FROM DUAL ) , T_MONEY_MSTR AS ( SELECT 'SALARY' MONEY_TCD FROM DUAL ) ,T_PJT_MSTR AS ( SELECT 'P100' PJT_CD FROM DUAL UNION ALL SELECT 'P200' PJT_CD FROM DUAL ) [CASE1]. UNION ALL 후 JOIN SELECT * FROM (SELECT * FROM TABLE_A WHERE PJT_CD = 'P100' UNION ALL SELECT * FROM TABLE_B WHERE PJT_CD = 'P100') A1 INNER JOIN T_MONEY_MSTR A2 ON A1.MONEY_TCD = A2.MONEY_TCD INNER JOIN T_PJT_MSTR A3 ON A1.PJT_CD = A3.PJT_CD [CASE2]. 각각 JOIN 후 JOIN UNION ALL SELECT * FROM (SELECT * FROM TABLE_A A1 INNER JOIN T_MONEY_MSTR A2 ON A1.MONEY_TCD = A2.MONEY_TCD INNER JOIN T_PJT_MSTR A3 ON A1.PJT_CD = A3.PJT_CD UNION ALL SELECT * FROM TABLE_B B1 INNER JOIN T_MONEY_MSTR B2 ON B1.MONEY_TCD = B2.MONEY_TCD INNER JOIN T_PJT_MSTR B3 ON B1.PJT_CD = B3.PJT_CD ) WHERE PJT_CD = 'P100'
구글링을 해도 비슷한 답변을 찾지 못해 무척 혼란스럽습니다.
그리고 가능하다면 이유도 부탁드립니다.
감사합니다. ( _ _ )
일단 마스터성 두개와 코드성 두개인데요.
코드성 테이블 조인은 성능에 그리 큰 영향이 없을 듯 합니다.
그래도 여러번 사용하는 것 보다는 한번만 사용하는게 좋을 듯 하구요.
성능에 가장 큰 영향을 주는 것은 코드테이블 조인보다는
검색 범위를 줄여주는 조건에 있을 듯 한데요.
두번째 쿼리의 경우는 조건절이 밖에 있네요?
물론 쿼리 변환에 의해 조건절이 안으로 침투할수는 있겠지만...
불확실한 쿼리 변환에 의존하는 것 보다는
확실하게 조건을 안에다 주는 것이 좋을 듯 합니다.
질문에서는 통계정보를 낸다고 하셨는데요?
사용하신 쿼리는 통계나 집계 쿼리가 아닌 단순 조회 쿼리네요?
통계를 낼때와 단순 조회를 할때는 최적의 쿼리가 다를 수 있습니다.
또한 사용되는 항목이 어떤 테이블의 어떤 항목인지에 따라서도 최적의 쿼리는 달라질 수 있습니다.
질문을 명확하게 해주시는 게 좋을 듯 합니다.