(쿼리질문) 두 테이블 선 UNION ALL 후 JOIN? vs 선 JOIN 후 UNION ALL? 0 1 8,153

by 네오스타 UNION ALL JOIN [2015.09.21 01:45:01]


안녕하세요. 언제나 구루비 사이트를 눈팅하며 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' 

 

  

구글링을 해도 비슷한 답변을 찾지 못해 무척 혼란스럽습니다.
그리고 가능하다면 이유도 부탁드립니다.
감사합니다. ( _  _ )

 

 

by 마농 [2015.09.21 08:46:56]

일단 마스터성 두개와 코드성 두개인데요.
코드성 테이블 조인은 성능에 그리 큰 영향이 없을 듯 합니다.
그래도 여러번 사용하는 것 보다는 한번만 사용하는게 좋을 듯 하구요.


성능에 가장 큰 영향을 주는 것은 코드테이블 조인보다는
검색 범위를 줄여주는 조건에 있을 듯 한데요.
두번째 쿼리의 경우는 조건절이 밖에 있네요?
물론 쿼리 변환에 의해 조건절이 안으로 침투할수는 있겠지만...
불확실한 쿼리 변환에 의존하는 것 보다는
확실하게 조건을 안에다 주는 것이 좋을 듯 합니다.


질문에서는 통계정보를 낸다고 하셨는데요?
사용하신 쿼리는 통계나 집계 쿼리가 아닌 단순 조회 쿼리네요?
통계를 낼때와 단순 조회를 할때는 최적의 쿼리가 다를 수 있습니다.
또한 사용되는 항목이 어떤 테이블의 어떤 항목인지에 따라서도 최적의 쿼리는 달라질 수 있습니다.
질문을 명확하게 해주시는 게 좋을 듯 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입