안녕하세요, 선배님들. 현재, 시스템의 어떠한 함수에서 다음의 쿼리를 네 번 실행합니다. 다만, WHERE 조건에서 A3(T_ITEM) 테이블의 C_PROCURE 값만 변경하여 쿼리를 실행합니다. (EX: A3.C_PROCURE = 'A' / A3.C_PROCURE = 'B' / A3.C_PROCURE = 'C') <<< 이러한 형태로 말이지요. 각 테이블마다 16~17만건 가까이 레코드가 쌓여있기에 쿼리 최적화가 필요할 듯한데요. WHERE 조건 하나 때문에 아래의 쿼리를 네 번 실행한다는 건 효율성이 떨어진다는 판단을 하였습니다. 결론적으로 A, B, C, D 데이터는 각각의 데이터이나, C_PROCURE를 좀 더 효율적으로 처리할 수 있는 방법이 있을까요? 선배님들의 조언과 피드백 미리 감사드립니다 :)
SELECT A1.SALES_ORDER_NO -- 판매 주문 번호 , A1.SALES_YMD -- 판매 일자 , A1.ORDER_DIV_CODE -- 소속 코드 -발주 , A1.ITEM_SEQ -- 제품 일련 번호 , A1.ABBR_CODE -- 단축 코드 (바코드) , A1.TRN_UNIT_AMT -- 판매 단가 , A1.SALES_CNT -- 판매 수량 , A1.SUM_AMT -- 판매 합계 금액 , A1.CLT_INDIV_SEQ -- 개인 고객 일련번호 , A1.REL_NAME -- 관계자명 , A1.C_SALE_PROC -- 판매 처리 공통 코드 , A1.C_PYMT_MTHD -- 결제 방식 공통 코드 , A1.RATE_DC -- 할인률 , A1.RMK_REPARE -- 수선 비고 , A2.DIV_NAME -- 소속명 , A3.ITEM_NAME -- 제품 자재명 , A3.C_PROCURE -- 조달 구분 공통 코드 , A4.CLT_INDIV_NAME -- 개인 고객명 , A4.C_CLT_INDIV -- 개인 고객 유형 공통 코드 , (CASE WHEN (A4.C_CLT_INDIV IS NOT NULL) THEN (SELECT CODE_NAME FROM T_CODE WHERE CODE = A4.C_CLT_INDIV) ELSE '' END) AS DUTY_NAME -- 개인 고객 유형 , A5.CLT_ORG_NAME -- 기관 고객명 , A5.CLT_ORG_SEQ -- 기관 고객 일련번호 -- , A6.C_PYMT_MTHD -- 이전 결제 방식 공통 코드 , A6.C_PYMT_TYPE -- 결제 종류 공통 코드 , A7.CODE_NAME AS COLOR -- 색상 , A8.CODE_NAME AS FABRIC -- 원단 FROM T_SALES AS A1 -- 판매 LEFT OUTER JOIN T_DIVISION AS A2 ON A1.ORDER_DIV_CODE = A2.DIV_CODE AND (A2.C_DIV_TYPE = 'C' AND A2.USE_YN = 'Y') -- 센터 LEFT OUTER JOIN T_ITEM AS A3 ON A1.ITEM_SEQ = A3.ITEM_SEQ -- 제품 LEFT OUTER JOIN T_CLIENT_INDIV AS A4 ON A1.CLT_INDIV_SEQ = A4.CLT_INDIV_SEQ -- 개인 고객 LEFT OUTER JOIN T_CLIENT_ORG AS A5 ON A1.C_DIOCESE = A5.C_DIOCESE AND A1.CLT_ORG_SEQ = A5.CLT_ORG_SEQ -- 고객 유형 (사목지) LEFT OUTER JOIN ( SELECT SALES_ORDER_NO, C_PYMT_TYPE, C_PYMT_MTHD FROM ( SELECT SALES_ORDER_NO, C_PYMT_TYPE, C_PYMT_MTHD FROM T_PAYMENT limit 100 ) AS P GROUP BY SALES_ORDER_NO, C_PYMT_TYPE, C_PYMT_MTHD LIMIT 1 ) AS A6 ON A1.SALES_ORDER_NO = A6.SALES_ORDER_NO AND A1.C_PYMT_MTHD = A6.C_PYMT_MTHD -- 결제 LEFT OUTER JOIN (SELECT CODE, CODE_NAME FROM T_CODE WHERE UPP_CODE = 'C_COLOR') AS A7 ON A3.C_COLOR = A7.CODE -- 색상 LEFT OUTER JOIN (SELECT CODE, CODE_NAME FROM T_CODE WHERE UPP_CODE = 'C_FABRIC') AS A8 ON A3.C_FABRIC = A8.CODE -- 원단 WHERE (A1.C_SALE_PROC = 2 OR A1.C_SALE_PROC = 3) -- 판매 처리 공통 코드 (Pix) AND A3.C_ITEM_USE != 'B' -- 제품 사용 구분 공통 코드 (Pix) AND A3.C_PROCURE = #{cProcure} -- 조달 구분 공통 코드 (Required)
select A1.SALES_ORDER_NO -- 판매 주문 번호 , A1.SALES_YMD -- 판매 일자 , A1.ORDER_DIV_CODE -- 소속 코드 -발주 , A1.ITEM_SEQ -- 제품 일련 번호 , A1.ABBR_CODE -- 단축 코드 (바코드) , A1.TRN_UNIT_AMT -- 판매 단가 , A1.SALES_CNT -- 판매 수량 , A1.SUM_AMT -- 판매 합계 금액 , A1.CLT_INDIV_SEQ -- 개인 고객 일련번호 ,A3.C_PROCURE -- 페이지 구분자 from t_sales as A1 -- 판매 left outer join t_division as A2 on A1.ORDER_DIV_CODE = A2.DIV_CODE and (A2.C_DIV_TYPE = 'C' and A2.USE_YN = 'Y') -- 센터 left outer join t_item as A3 on A1.ITEM_SEQ = A3.ITEM_SEQ -- 제품 AND A3.C_PROCURE IN ('A','B','C','D') left outer join t_client_indiv as A4 on A1.CLT_INDIV_SEQ = A4.CLT_INDIV_SEQ -- 개인 고객 left outer join t_client_org as A5 on A1.C_DIOCESE = A5.C_DIOCESE and A1.CLT_ORG_SEQ = A5.CLT_ORG_SEQ -- 고객 유형 (사목지) >>>>> 추가 확인 필요 left outer join ( SELECT SALES_ORDER_NO, C_PYMT_TYPE, C_PYMT_MTHD FROM ( SELECT SALES_ORDER_NO, C_PYMT_TYPE, C_PYMT_MTHD FROM T_PAYMENT limit 100 ) AS P GROUP BY SALES_ORDER_NO, C_PYMT_TYPE, C_PYMT_MTHD LIMIT 1 ) as A6 on A1.SALES_ORDER_NO = A6.SALES_ORDER_NO and A1.C_PYMT_MTHD = A6.C_PYMT_MTHD -- 결제 LEFT OUTER JOIN (SELECT CODE, CODE_NAME FROM T_CODE WHERE UPP_CODE = 'C_COLOR') AS A7 ON A3.C_COLOR = A7.CODE -- 색상 LEFT OUTER JOIN (SELECT CODE, CODE_NAME FROM T_CODE WHERE UPP_CODE = 'C_FABRIC') AS A8 ON A3.C_FABRIC = A8.CODE -- 원단 where (A1.C_SALE_PROC = '2' or A1.C_SALE_PROC = '3') and A3.C_ITEM_USE != 'B' and A3.C_PROCURE = 2 and A1.ORDER_DIV_CODE = 'C16' AND (A1.SALES_YMD >= '20150101' AND A1.SALES_YMD <= '20150201') -- 판매일 order by A1.SALES_YMD, A1.SALES_ORDER_NO, SALES_SORT_ORD ;
이런식으로 처리하면 될까 싶네요.