아래 쿼리문 실행시에 코드값에 대한 명칭을 INNER JOIN 으로 가져올 경우 실행계획 보시면
코드 테이블에 대한 명칭을 FULL 스캔하여 속도 저하가 발생하는 거 같습니다.
코드값에 대한 명칭을 FULL 스캔하지 않고 인덱스로 가져올수 있는 방법은 없는지 도움 요청합니다.
아래 데이터는 작은 데이터로 테스트한 경우라 TABLE ACCESS (FULL) 인경우 COST=3(빨간색 표시부분) 이지만
실제 업무단에서는 대용량 데이타라 COST=15M 값이 나옵니다.
감사합니다.
<인덱스 설정>
CREATE INDEX ATS.IDX1_TB_MP_AP_PS_UGMCHTGRPTOT ON ATS.TB_MP_AP_PS_UGMCHTGRPTOT
(APV_DT, RVG_TUP_ID, RVG_MCHT_GRP_ID, UG_TUP_ID, UG_MCHT_GRP_ID,TR_DS_C, TR_TP_C, TR_RSN_C)
WITH V_TB_MP_AP_PS_UGMCHTGRPTOT AS (SELECT APV_DT AS APV_DT ,RVG_TUP_ID AS RVG_TUP_ID ,RVG_MCHT_GRP_ID AS RVG_MCHT_GRP_ID ,UG_TUP_ID AS UG_TUP_ID ,UG_MCHT_GRP_ID AS UG_MCHT_GRP_ID ,TR_DS_C AS TR_DS_C ,TR_TP_C AS TR_TP_C ,TR_RSN_C AS TR_RSN_C ,SUM(NVL(TR_CN, 0)) AS CN ,SUM(NVL(TR_PNT, 0)) AS PNT FROM TB_MP_AP_PS_UGMCHTGRPTOT A WHERE 1=1 AND APV_DT BETWEEN '20190101' AND '20190230' GROUP BY APV_DT ,RVG_TUP_ID ,RVG_MCHT_GRP_ID ,UG_TUP_ID ,UG_MCHT_GRP_ID ,TR_DS_C ,TR_TP_C ,TR_RSN_C) SELECT SUBSTR(A.APV_DT,1,6) AS APV_YM , A.RVG_TUP_ID AS RVG_TUP_ID -- 코드1 , B.TUP_NM AS RVG_TUP_NM -- 명칭1 , A.RVG_MCHT_GRP_ID AS RVG_MCHT_GRP_ID -- 코드2 , C.NCHT_NM AS RVG_MCHT_GRP_NM -- 명칭2 , A.UG_TUP_ID AS UG_TUP_ID -- 코드3 , D.TUP_NM AS UG_TUP_NM -- 명칭3 , A.UG_MCHT_GRP_ID AS UG_MCHT_GRP_ID -- 코드4 , E.NCHT_NM AS UG_MCHT_GRP_NM -- 명칭4 , A.TR_DS_C AS TR_DS_C , A.TR_TP_C AS TR_TP_C , A.TR_RSN_C AS TR_RSN_C , SUM(A.CN) AS CN , SUM(A.PNT) AS PNT FROM V_TB_MP_AP_PS_UGMCHTGRPTOT A , TB_MP_AL_LM_MSTR B , TB_MP_AL_LM_MCHTMSTR C , TB_MP_AL_LM_MSTR D , TB_MP_AL_LM_MCHTMSTR E WHERE A.RVG_TUP_ID = B.TUP_ID AND A.RVG_TUP_ID = C.TUP_ID AND A.RVG_MCHT_GRP_ID = C.MCHT_ID AND A.UG_TUP_ID = D.TUP_ID AND A.UG_TUP_ID = E.TUP_ID AND A.UG_MCHT_GRP_ID = E.MCHT_ID GROUP BY SUBSTR(A.APV_DT,1,6) , A.RVG_TUP_ID , B.TUP_NM , A.RVG_MCHT_GRP_ID , C.NCHT_NM , A.UG_TUP_ID , D.TUP_NM , A.UG_MCHT_GRP_ID , E.NCHT_NM , A.TR_DS_C , A.TR_TP_C , A.TR_RSN_C ORDER BY SUBSTR(A.APV_DT,1,6) , A.RVG_TUP_ID , B.TUP_NM , A.RVG_MCHT_GRP_ID , C.NCHT_NM , A.UG_TUP_ID , D.TUP_NM , A.UG_MCHT_GRP_ID , E.NCHT_NM , A.TR_DS_C , A.TR_TP_C , A.TR_RSN_C ;
드라이빙 순서가 잘못된거 같습니다.
WITH V_TB_MP_AP_PS_UGMCHTGRPTOT AS (SELECT /*+ materialize */ <= 이부분 변경 APV_DT AS APV_DT ,RVG_TUP_ID AS RVG_TUP_ID ,RVG_MCHT_GRP_ID AS RVG_MCHT_GRP_ID ,UG_TUP_ID AS UG_TUP_ID ,UG_MCHT_GRP_ID AS UG_MCHT_GRP_ID ,TR_DS_C AS TR_DS_C ,TR_TP_C AS TR_TP_C ,TR_RSN_C AS TR_RSN_C ,SUM(NVL(TR_CN, 0)) AS CN ,SUM(NVL(TR_PNT, 0)) AS PNT FROM TB_MP_AP_PS_UGMCHTGRPTOT A WHERE 1=1 AND APV_DT BETWEEN '20190101' AND '20190230' GROUP BY APV_DT ,RVG_TUP_ID ,RVG_MCHT_GRP_ID ,UG_TUP_ID ,UG_MCHT_GRP_ID ,TR_DS_C ,TR_TP_C ,TR_RSN_C)
......
SELECT /*+ LEADING(A) */ <= 이부분 변경 SUBSTR(A.APV_DT,1,6) AS APV_YM , A.RVG_TUP_ID AS RVG_TUP_ID -- 코드1 , B.TUP_NM AS RVG_TUP_NM -- 명칭1 , A.RVG_MCHT_GRP_ID AS RVG_MCHT_GRP_ID -- 코드2 , C.NCHT_NM AS RVG_MCHT_GRP_NM -- 명칭2 , A.UG_TUP_ID AS UG_TUP_ID -- 코드3 , D.TUP_NM AS UG_TUP_NM -- 명칭3 , A.UG_MCHT_GRP_ID AS UG_MCHT_GRP_ID -- 코드4 , E.NCHT_NM AS UG_MCHT_GRP_NM -- 명칭4 , A.TR_DS_C AS TR_DS_C , A.TR_TP_C AS TR_TP_C , A.TR_RSN_C AS TR_RSN_C , SUM(A.CN) AS CN , SUM(A.PNT) AS PNT FROM V_TB_MP_AP_PS_UGMCHTGRPTOT A , TB_MP_AL_LM_MSTR B , TB_MP_AL_LM_MCHTMSTR C , TB_MP_AL_LM_MSTR D , TB_MP_AL_LM_MCHTMSTR E
SELECT SUBSTR(T2.APV_DT,1,6) AS APV_YM , T2.RVG_TUP_ID AS RVG_TUP_ID -- 코드1 , (SELECT TUP_NM FROM TB_MP_AL_LM_MSTR S1 WHERE S1.TUP_ID = T2.RVG_TUP_ID) AS RVG_TUP_NM -- 명칭1 , T2.RVG_MCHT_GRP_ID AS RVG_MCHT_GRP_ID -- 코드2 , (SELECT NCHT_NM FROM TB_MP_AL_LM_MCHTMSTR S2 WHERE S2.TUP_ID = T2.RVG_TUP_ID AND S2.MCHT_ID = T2.RVG_MCHT_GRP_ID) AS RVG_MCHT_GRP_NM -- 명칭2 , T2.UG_TUP_ID AS UG_TUP_ID -- 코드3 , (SELECT TUP_NM FROM TB_MP_AL_LM_MSTR S3 WHERE S3.TUP_ID = T2.UG_TUP_ID) AS UG_TUP_NM -- 명칭3 , T2.UG_MCHT_GRP_ID AS UG_MCHT_GRP_ID -- 코드4 , (SELECT NCHT_NM FROM TB_MP_AL_LM_MCHTMSTR S2 WHERE E.TUP_ID = T2.UG_TUP_ID AND E.MCHT_ID = T2.UG_MCHT_GRP_ID) AS UG_MCHT_GRP_NM -- 명칭4 , T2.TR_DS_C AS TR_DS_C , T2.TR_TP_C AS TR_TP_C , T2.TR_RSN_C AS TR_RSN_C , T2.CN AS CN , T2.PNT AS PNT FROM (SELECT ROWNUM AS RN , T1.* FROM (SELECT APV_DT , RVG_TUP_ID , RVG_MCHT_GRP_ID , UG_TUP_ID , UG_MCHT_GRP_ID , TR_DS_C , TR_TP_C , TR_RSN_C , SUM(NVL(TR_CN, 0)) , SUM(NVL(TR_PNT, 0)) FROM TB_MP_AP_PS_UGMCHTGRPTOT WHERE 1=1 AND APV_DT BETWEEN '20190101' AND '20190230' GROUP BY APV_DT, RVG_TUP_ID, RVG_MCHT_GRP_ID, UG_TUP_ID, UG_MCHT_GRP_ID, TR_DS_C, TR_TP_C, TR_RSN_C ORDER BY APV_DT, RVG_TUP_ID, RVG_MCHT_GRP_ID, UG_TUP_ID, UG_MCHT_GRP_ID, TR_DS_C, TR_TP_C, TR_RSN_C ) T1 WHERE ROWNUM <= :b1 --30 ) T2 WHERE RN >= :b2 --1 ;