페이징 쿼리 질문 0 1 3,753

by 통쓰 [SQL Query] [2024.03.15 14:22:29]


실행계획.png (98,712Bytes)

오라클 사용중인데요!  쿼리가 많이 느린데.....방안이 있을까요..

실행계획



SELECT B.*
  FROM (
	    SELECT CEIL(ROWNUM / nvl(NULL, 9999999)) CURRENT_PAGE,
		       COUNT(*) OVER() AS TOTAL_COUNT,
		       A.*
	      FROM
			(
			SELECT A.COMP_CD,
				   A.ORD_DT,
				   A.DELI_REQ_DT,
				   A.DELI_REQ_DT AS CHECK_DT,
				   A.DELI_TP,
				   A.ORD_NO,
				   A.ORD_TP,
				   A.SAP_DOC_NO,
				   FX_CODE_NM('COMM', 'SD0010', A.ORD_TP) AS ORD_TP_NM,
				   FX_CODE_NM('DEPT', A.COMP_CD, A.DEPT_CD) AS DEPT_NM,
				   FX_CODE_NM('USER', A.COMP_CD, A.SALES_ID) AS SALES_NM,
				    A.CUST_CD,
				   FX_CODE_NM('CUST', A.COMP_CD, A.CUST_CD) AS CUST_NM,
				   FX_CODE_NM('COMM', 'SD0080', A.LOGISTIC_CD) AS LOGISTIC_NM,
		           FX_CODE_NM('COMM', 'SD0020', A.DELI_TP) DELI_TP_NM,
				   CASE WHEN A.URGENT_YN = 'Y' 
				        THEN '긴급'
					    ELSE '일반'
				         END URGENT_YN,
				   CASE WHEN A.ALLOW_YN = 'Y' 
				        THEN '승인'
					    ELSE '미승인'
				         END ALLOW_YN,
				   FX_CODE_NM('COMM', 'BC0710', A.EDI_TP) AS EDI_NM,
				   FX_CODE_NM('COMM', 'BC0040', A.TAX_TP) AS TAX_NM,
				   FX_CODE_NM('COMM', 'SD0050', A.TRANS_TP) AS TRANS_NM,
				   A.STATUS,
				   FX_CODE_NM('COMM', 'SD0040', A.STATUS) AS STATUS_NM,
				   A.ADDR1 AS ADDR,
				   A.REF_ORD_NO,
				   A.EDI_MESG_NO,
				   A.SLIP_DT,
				   TO_CHAR(A.SUPPLY_AMT, '999,999,999') AS SUPPLY_AMT,
				   TO_CHAR(A.TOT_AMT, '999,999,999') AS TOT_AMT,
				   A.PROD_DT,
				   A.OUT_DT,
				   A.OUT_NO,
				   A.TRANS_TP,
				   SUM(B.CFM_QTY) AS CFM_QTY,
				   SUM(B.ORD_QTY) AS ORD_QTY,
				   SUM((SELECT SUM(CFM_QTY)FROM SD_ORDER_DET WHERE COMP_CD = A.COMP_CD AND ORD_NO = A.ORD_NO)) OVER() AS TOTAL_CFM_QTY,
				   SUM((SELECT SUM(ORD_QTY) FROM SD_ORDER_DET WHERE COMP_CD = A.COMP_CD AND ORD_NO = A.ORD_NO)) OVER() AS TOTAL_ORD_QTY
			  FROM ORDER_MST A
			  JOIN ORDER_DET B ON A.COMP_CD = B.COMP_CD
		       AND A.ORD_NO = B.ORD_NO
		     WHERE 1 = 1
			   AND A.COMP_CD = '2200'
			   AND A.DELI_REQ_DT BETWEEN REPLACE('20240212', '-', '') AND REPLACE('20240315', '-', '')
	      GROUP BY A.COMP_CD,
				 A.ORD_DT,
				 A.DELI_REQ_DT,
				 A.DELI_TP,
				 A.ORD_NO,
				 A.ORD_TP,
				 A.SAP_DOC_NO,
				 A.DEPT_CD,
			  	 A.SALES_ID,
				 A.CUST_CD,
				 A.LOGISTIC_CD,
				 A.DELI_TP,
				 A.URGENT_YN,
				 A.ALLOW_YN,
				 A.EDI_TP,
				 A.STATUS,
				 A.TAX_TP,
				 A.ADDR1,
			 	 A.REF_ORD_NO,
				 A.EDI_MESG_NO,
				 A.SLIP_DT,
				 A.SUPPLY_AMT,
				 A.TOT_AMT,
				 A.PROD_DT,
				 A.OUT_DT,
				 A.OUT_NO,
				 A.TRANS_TP 
		 ) A
	 ) B
 WHERE CURRENT_PAGE = nvl(NULL, 1)

 

by 마농 [2024.03.15 14:42:41]

1. 페이징 처리 시점 변경
 - 현재 : 모든 처리(조인, 집계, 함수 등)가 완료된 후에 페이징 처리
 - 개선 : A 테이블 원본 만으로 페이징 후에 후속 처리
2. ROWNUM 조건 개선
 - 현재 : 맨 마지막에 페이징 조건
 - 개선 : 인라인뷰 안에서 ROWNUM <= (페이지번호 * 페이지당건수) 조건 추가 필요

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