Postgresql / PPAS/Query tuning
[ 완료]/*new4dSchedule.distr.new4dScheduleListPageData*/
원샷원따봉
2022. 8. 29. 13:25
-- 개선 결과
AS-IS Total query runtime: 1 secs 969 msec. TO-BE Total query runtime: 511 msec. |
* 분석 내용
-- 해당 쿼리는 4개 쿼리를 inner join 하고 1개 테이블을 Outer Join 해서 가져오는 쿼리로 Outer join 쿼리로 인해 늦어지는 쿼리 -- Outer 대상 imcsuser.PT_LW_SCHE_PROCESS_INFO 테이블 사용하지 않기 때문에 제거. |
* 원본 쿼리
SELECT /*new4dSchedule.distr.new4dScheduleListPageData*/ TOTAL_CNT , RNUM , SCHEDULE_ID , SEQ_NO , CONTENTS_NAME , PRESET_CODE , PRESET_SEQ_NO , CONTENT_VALUE , FILE_PATH1 , FILE_NAME1 , FILE_SIZE1 , SAVED_FILE_NAME1 , SVC_FILE_NAME1 , FILE_PATH2 , FILE_NAME2 , FILE_SIZE2 , SAVED_FILE_NAME2 , SVC_FILE_NAME2 , FILE_PATH3 , FILE_NAME3 , FILE_SIZE3 , SAVED_FILE_NAME3 , SVC_FILE_NAME3 , FILE_PATH4 , FILE_NAME4 , FILE_SIZE4 , SAVED_FILE_NAME4 , SVC_FILE_NAME4 , FILE_PATH5 , FILE_NAME5 , FILE_SIZE5 , SAVED_FILE_NAME5 , SVC_FILE_NAME5 , TO_CHAR(to_timestamp(AA.INSERT_DATE,'YYYYMMDDhh24miss'), 'YYYY-MM-DD hh24:mi:ss') AS INSERT_DATE, COALESCE((SELECT USER_NAME FROM imcsuser.PT_LW_USER A WHERE A.USER_ID = AA.INSERT_ID), '') AS INSERT_ID, TO_CHAR(to_timestamp(AA.UPDATE_DATE,'YYYYMMDDhh24miss'), 'YYYY-MM-DD hh24:mi:ss') AS UPDATE_DATE, COALESCE((SELECT USER_NAME FROM imcsuser.PT_LW_USER A WHERE A.USER_ID = AA.UPDATE_ID), '') AS UPDATE_ID, STATUS, PROCESS_STATUS, TO_CHAR(TO_DATE(AA.SVC_START_DATE,'YYYYMMDD'), 'YYYY-MM-DD') AS SVC_START_DATE, TO_CHAR(TO_DATE(AA.SVC_END_DATE,'YYYYMMDD'), 'YYYY-MM-DD') AS SVC_END_DATE, EXCEPT_YN, ALBUM_ID FROM ( SELECT COUNT(PFILE.SCHEDULE_ID) OVER() AS TOTAL_CNT , ROW_NUMBER() OVER ( ORDER BY PFILE.INSERT_DATE DESC) RNUM , PFILE.SCHEDULE_ID , PFILE.SEQ_NO , PFILE.CONTENTS_NAME , PFILE.PRESET_CODE , PFILE.PRESET_SEQ_NO , PFILE.CONTENT_VALUE , PFILE.FILE_PATH1 , PFILE.FILE_NAME1 , PFILE.FILE_SIZE1 , PFILE.SAVED_FILE_NAME1 , PFILE.SVC_FILE_NAME1 , PFILE.FILE_PATH2 , PFILE.FILE_NAME2 , PFILE.FILE_SIZE2 , PFILE.SAVED_FILE_NAME2 , PFILE.SVC_FILE_NAME2 , PFILE.FILE_PATH3 , PFILE.FILE_NAME3 , PFILE.FILE_SIZE3 , PFILE.SAVED_FILE_NAME3 , PFILE.SVC_FILE_NAME3 , PFILE.FILE_PATH4 , PFILE.FILE_NAME4 , PFILE.FILE_SIZE4 , PFILE.SAVED_FILE_NAME4 , PFILE.SVC_FILE_NAME4 , PFILE.FILE_PATH5 , PFILE.FILE_NAME5 , PFILE.FILE_SIZE5 , PFILE.SAVED_FILE_NAME5 , PFILE.SVC_FILE_NAME5 , MST.STATUS, MST.INSERT_DATE , MST.INSERT_ID , MST.UPDATE_DATE , MST.UPDATE_ID, DTL.PROCESS_STATUS, AST.SVC_START_DATE, AST.SVC_END_DATE, AST.EXCEPT_YN, DTL.ALBUM_ID FROM imcsuser.PT_LW_SCHE_PRESET_FILE PFILE join imcsuser.PT_LW_SCHE_MST MST on PFILE.SCHEDULE_ID = MST.SCHEDULE_ID join imcsuser.PT_LW_SCHE_DTL DTL on MST.SCHEDULE_ID = DTL.SCHEDULE_ID join imcsuser.PT_LW_SCHE_ASSET AST on MST.SCHEDULE_ID = AST.SCHEDULE_ID and DTL.SEQ_NO = AST.SEQ_NO LEFT OUTER JOIN imcsuser.PT_LW_SCHE_PROCESS_INFO INFO ON MST.SCHEDULE_ID = INFO.SCHEDULE_ID and DTL.SEQ_NO = INFO.SEQ_NO WHERE 1=1 )AA WHERE AA.RNUM BETWEEN 0+1 AND 0 + 50 |
* 튜닝 쿼리
begin; set work_mem=200000; SELECT /*new4dSchedule.distr.new4dScheduleListPageData*/ TOTAL_CNT , RNUM , SCHEDULE_ID , SEQ_NO , CONTENTS_NAME , PRESET_CODE , PRESET_SEQ_NO , CONTENT_VALUE , FILE_PATH1 , FILE_NAME1 , FILE_SIZE1 , SAVED_FILE_NAME1 , SVC_FILE_NAME1 , FILE_PATH2 , FILE_NAME2 , FILE_SIZE2 , SAVED_FILE_NAME2 , SVC_FILE_NAME2 , FILE_PATH3 , FILE_NAME3 , FILE_SIZE3 , SAVED_FILE_NAME3 , SVC_FILE_NAME3 , FILE_PATH4 , FILE_NAME4 , FILE_SIZE4 , SAVED_FILE_NAME4 , SVC_FILE_NAME4 , FILE_PATH5 , FILE_NAME5 , FILE_SIZE5 , SAVED_FILE_NAME5 , SVC_FILE_NAME5 , TO_CHAR(to_timestamp(AA.INSERT_DATE,'YYYYMMDDhh24miss'), 'YYYY-MM-DD hh24:mi:ss') AS INSERT_DATE, COALESCE((SELECT USER_NAME FROM imcsuser.PT_LW_USER A WHERE A.USER_ID = AA.INSERT_ID), '') AS INSERT_ID, TO_CHAR(to_timestamp(AA.UPDATE_DATE,'YYYYMMDDhh24miss'), 'YYYY-MM-DD hh24:mi:ss') AS UPDATE_DATE, COALESCE((SELECT USER_NAME FROM imcsuser.PT_LW_USER A WHERE A.USER_ID = AA.UPDATE_ID), '') AS UPDATE_ID, STATUS, PROCESS_STATUS, TO_CHAR(TO_DATE(AA.SVC_START_DATE,'YYYYMMDD'), 'YYYY-MM-DD') AS SVC_START_DATE, TO_CHAR(TO_DATE(AA.SVC_END_DATE,'YYYYMMDD'), 'YYYY-MM-DD') AS SVC_END_DATE, EXCEPT_YN, ALBUM_ID FROM ( SELECT COUNT(PFILE.SCHEDULE_ID) OVER() AS TOTAL_CNT , ROW_NUMBER() OVER ( ORDER BY PFILE.INSERT_DATE DESC) RNUM , PFILE.SCHEDULE_ID , PFILE.SEQ_NO , PFILE.CONTENTS_NAME , PFILE.PRESET_CODE , PFILE.PRESET_SEQ_NO , PFILE.CONTENT_VALUE , PFILE.FILE_PATH1 , PFILE.FILE_NAME1 , PFILE.FILE_SIZE1 , PFILE.SAVED_FILE_NAME1 , PFILE.SVC_FILE_NAME1 , PFILE.FILE_PATH2 , PFILE.FILE_NAME2 , PFILE.FILE_SIZE2 , PFILE.SAVED_FILE_NAME2 , PFILE.SVC_FILE_NAME2 , PFILE.FILE_PATH3 , PFILE.FILE_NAME3 , PFILE.FILE_SIZE3 , PFILE.SAVED_FILE_NAME3 , PFILE.SVC_FILE_NAME3 , PFILE.FILE_PATH4 , PFILE.FILE_NAME4 , PFILE.FILE_SIZE4 , PFILE.SAVED_FILE_NAME4 , PFILE.SVC_FILE_NAME4 , PFILE.FILE_PATH5 , PFILE.FILE_NAME5 , PFILE.FILE_SIZE5 , PFILE.SAVED_FILE_NAME5 , PFILE.SVC_FILE_NAME5 , MST.STATUS, MST.INSERT_DATE , MST.INSERT_ID , MST.UPDATE_DATE , MST.UPDATE_ID, DTL.PROCESS_STATUS, AST.SVC_START_DATE, AST.SVC_END_DATE, AST.EXCEPT_YN, DTL.ALBUM_ID FROM imcsuser.PT_LW_SCHE_PRESET_FILE PFILE join imcsuser.PT_LW_SCHE_MST MST on PFILE.SCHEDULE_ID = MST.SCHEDULE_ID join imcsuser.PT_LW_SCHE_DTL DTL on MST.SCHEDULE_ID = DTL.SCHEDULE_ID join imcsuser.PT_LW_SCHE_ASSET AST on MST.SCHEDULE_ID = AST.SCHEDULE_ID and DTL.SEQ_NO = AST.SEQ_NO WHERE 1=1 )AA WHERE AA.RNUM BETWEEN 0+1 AND 0 + 50 commit; |