group by 관련 문의 드립니다. 0 1 1,604

by 최진영 [SQL Query] [2016.05.13 10:23:43]


explain.jpg (97,267Bytes)

SELECT
      FF.USER_KEY,   
      S.GROUP_NAME,
      S.SORT_NO,
      NVL(SUM(FF.LAST_PRICE * FF.ORDER_QTY), 0) LASTPRICE
FROM
(
  SELECT
      A.USER_KEY
      ,G.GOODS_CODE
      ,G.SELLER_CD
      ,G.LAST_PRICE
      ,G.ORDER_QTY

  FROM
      ORDER_INFO A  LEFT JOIN ORDER_GOODS G ON A.order_num = G.order_num
  WHERE
      A.ORDER_DT BETWEEN (TO_CHAR(SYSDATE, 'YYYYMM') || '010000')
      AND (TO_CHAR(SYSDATE, 'YYYY') || '31235959')
      AND ( (A.PAY_FORM = '2' AND A.ORDER_STATUS = 'T02') OR (A.PAY_FORM = '3' AND A.ORDER_STATUS IN ('T01','T02')) )
      AND A.MALL_TYPE = '2'
      AND A.DOMAIN_ID = 'www'
      AND A.ORDER_PATH != '06'
         
) FF
LEFT JOIN STATISTICS_GOODS_CODE_GROUP S ON S.GOODS_CODE = FF.GOODS_CODE AND S.SELLER_CD = FF.SELLER_CD
WHERE S.GROUP_NAME IS NOT NULL
GROUP BY FF.USER_KEY, S.GROUP_NAME, S.SORT_NO

 

======================

 쿼리에서
NVL(SUM(FF.LAST_PRICE * FF.ORDER_QTY), 0) LASTPRICE 부분과 group by 부분을 제외하면 실행속도 0.047 seconds 인데 해당부분을 포함하면 2.137 seconds 가 됩니다.
sum을 위해서 group by를 사용하여야 하는데 explain 을 해보면 group by 가 FF 결과값에서만 실행 되지 않는거 같습니다.
속도 개선할 방법을 알고 싶습니다.

감사합니다.

by 마농 [2016.05.13 10:56:59]

글쎄요?
쿼리에 몇가지 문제가 있긴 한데 속도와는 큰 상관 없을 듯 한데요?
그냥 데이터가 많아서 느린게 아닐런지요?
Group By 를 빼면 전체자료중 일부만 우선 출력되기 때문에 빠르게 느껴집니다.
Group By 를 넣으면 전체자료를 다 읽어서 집계해야 하기 때문에 느리죠.


1. order_dt Between 절의 조건이 이상해요(월이 빠진 듯)
  - (TO_CHAR(sysdate, 'yyyy') || '31235959') ===> '201631235959' ???
2. 무의미한 Left Join
  - g 를 아우터조인 한후 그걸로 다시 s 를 아우터 조인하는데
  - 마지막으로 IS NOT NULL 체크로 인해 아우터 조인은 무의미해 짐
  - 두번의 아우터 조인은 그냥 이너조인을 해야 마땅함
  - 이 부분이 속도에 영향을 줄 수는 있겠네요.
3. 마지막 group_name 가져오는 조인이?
  - 왜? Unique 스캔이 아닌 Range 스캔일까요?
  - 조인 조건이 빠진건 아닌지?

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