400만건 이상 데이터 쿼리 속도문제로 인해 인덱스 거는방법 질문드립니다 0 3 1,163

by 겸둥이k [SQL Query] 인덱스 속도 [2019.05.09 09:50:26]


캡처.PNG (12,654Bytes)

 SELECT
                           A.p_code
                         , A.c_code    
                          ,NVL(A.cnt1, 0) cnt1
                         , COUNT(CASE WHEN VSC.SCH_SEQ2 > 0 AND TO_CHAR(VSC.WORK_DATE   , 'WW') + 0 <= ( SELECT TO_CHAR(SYSDATE,'WW')-1 FROM DUAL ) AND TO_CHAR(VSC.WORK_DATE   , 'YYYY')<= ( SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL ) THEN 1 END) cnt2
                         , COUNT(CASE WHEN VSC.SCH_SEQ2 > 0 AND TO_CHAR(VSC.WORK_DATE   , 'WW') + 0 =( SELECT TO_CHAR(SYSDATE,'WW')+0 FROM DUAL )  AND TO_CHAR(VSC.WORK_DATE   , 'YYYY')= ( SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL ) THEN 1 END) cnt3
                         , COUNT(CASE WHEN VSC.SCH_SEQ3 > '0' AND TO_CHAR(VSC.GAE_DATE, 'WW') + 0 <=( SELECT TO_CHAR(SYSDATE,'WW')-1 FROM DUAL )  AND TO_CHAR(VSC.GAETONG_DATE   , 'YYYY')<= ( SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL ) THEN 1 END) cnt5
                         , COUNT(CASE WHEN VSC.SCH_SEQ3 > '0' AND TO_CHAR(VSC.GAE_DATE, 'WW') + 0 =( SELECT TO_CHAR(SYSDATE,'WW')+0 FROM DUAL ) AND TO_CHAR(VSC.GAETONG_DATE   , 'YYYY')= ( SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL ) THEN 1 END) cnt6
                    FROM (
                                 SELECT 
                                            SUBSTR( P_CODE ,0,4) P_CODE,
                                             F_CODE(SUBSTR( P_CODE ,0,4)) pCodeNm,
                                            C_CODE_NM, 
                                             C_CODE,
                                             SUM(cnt) cnt1
                                    FROM T_CODE 
                                        LEFT OUTER JOIN V_CON
                                           ON INST_L || '10' || SUBSTR(INST_S, 7, 2) = C_CODE            
                                    WHERE  P_CODE IN ('HW1010','HW2010','HW3010','HW4010')
                                    AND USE_YN='Y'
                                    GROUP BY P_CODE,  F_CODE(SUBSTR( P_CODE ,0,4)),C_CODE_NM,C_CODE
                        )A
                    LEFT OUTER JOIN V_WORK VSC
                       ON VSC.INST_L || '10' || SUBSTR(VSC.INST_S, 7, 2) = A.C_CODE
                     GROUP BY A.P_CODE,A.pCodeNm,A.C_CODE_NM,A.C_CODE,A.cnt1

 

 

100만건 이상인데이터 V_WORK 뷰

SELECT 'D' DIV, KN_DEPT1,KN_DEPT2, DEPT1, DEPT2, BUSI_DIV, INST_L, INST_M,  INST_S ,WORK_DATE, SCH_SEQ, SCH_SEQ2, SCH_SEQ3 , DCU_ID INST_ID,GAETONG_DATE FROM T_SCHEDULE_DC WHERE USE_YN ='Y' 
UNION ALL 
SELECT 'M' DIV, KN_DEPT1,KN_DEPT2, DEPT1, DEPT2, MIN(BUSI_DIV), REPLACE(INST_L ,'HW40','HW30') INST_L, MIN(REPLACE(INST_M,'HW40','HW30')) INST_M, MIN(REPLACE( INST_S,'HW40','HW30')) INST_S
,MIN(WORK_DATE),MIN(SCH_SEQ),MIN(SCH_SEQ2),MIN(SCH_SEQ3) ,MAC_MO,INST_ID,MIN(GAETONG_DATE)   FROM T_SCHEDULE_MODEM  WHERE USE_YN ='Y' AND MODEM_DIV='마스터' AND MAC_MO >'0' GROUP BY KN_DEPT1,KN_DEPT2, DEPT1, DEPT2,INST_L ,MAC_MO
UNION ALL
SELECT 'E' DIV, KN_DEPT1,KN_DEPT2, DEPT1, DEPT2, BUSI_DIV, INST_L, INST_M,  INST_S ,WORK_DATE, SCH_SEQ, SCH_SEQ2, SCH_SEQ3 ,INSTR_NUM  INST_ID,GAETONG_DATE FROM T_SCHEDULE_MO  WHERE USE_YN ='Y'

 

 

보통 4초이상 넘어가면안되는데 현재 14초 이상걸립니다. 뷰에 인덱스를 못거니까  해당 뷰에사용되는  T_SCHEDULE_DC ,T_SCHEDULE_MO 걸려고 하는데 어떻게 걸어야할지 ㅠ

LEFT OUTER JOIN V_WORK 조인걸때 조건기준으로 걸면되는걸로 아는데  예:  VSC.INST_L || '10' || SUBSTR(VSC.INST_S, 7, 2)   위에있는 이 조건으로요  그런데 안먹네요 ㅠ 왜그럴까요? 한번에  조건을 안걸고 INST_L,INST_S 하나로 걸어도 마찬가지로  풀스캔으로 조회해버리는데 ㅠ

 

 

 

 

by 마농 [2019.05.09 17:50:30]

각 테이블에 inst_l, inst_s 결합인덱스가 필요해 보이구요.
조건절이 반대로 바뀌면 좋겠네요. (inst_l, inst_s 를 결합하여 조인 ==> c_code 를 분할하여 조인)
inst_l, inst_s 가 어떤 형태로 저장되는지 궁금하네요.


by 겸둥이k [2019.05.09 18:06:31]

INST_L 은 HW10 

INST_M은 HW1010

INST_S는 HW101010  형식으로 저장이됩니다 규칙이죠 

그래서 P_CODE 즉 HW101010 과 같을때 값을불러오는거죠 근데 ㅠ 인덱스가 안타서 속도가 느린건지

아님 다른문제가 또 있는건지 알고싶습니다.


by 느훼훼 [2019.05.14 10:37:37]

힌트절 쓸 수 있나요? 최상위 select절 옆에 /*+RULE*/ 넣고 돌려보세요.

풀스캔 타는 절에도 써보시구요.

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