오라클 쿼리 IN절 문의 드립니다.. 0 4 2,857

by 통쓰 [SQL Query] [2024.04.22 10:45:02]


안녕하세요! 언제나 고생이 많으십니다!!

아래와 같이IN절 때문에 쿼리 속도가 너무 느린데 다른 방법이 있을까요...?

               SELECT A.ITEM_CD
                     , E.HIER_NM AS HIRCHY_CD_L1 
                     , D.HIER_NM AS HIRCHY_CD_L2
                     , C.HIER_NM AS HIRCHY_CD_L3
                     , A.ITEM_NM
                     , A.COMP_CD
                  FROM BC_ITEM A 
             LEFT JOIN BC_HIERARCHY C 
                    ON C.COMP_CD = A.COMP_CD
                   AND C.HIER_CD = A.HIRCHY_CD
                   AND C.HIER_TP = 'ITEM'  
             LEFT JOIN BC_HIERARCHY D 
                    ON D.COMP_CD = A.COMP_CD
                   AND D.HIER_CD = SUBSTR(A.HIRCHY_CD, 0, 8) 
                   AND D.HIER_TP = 'ITEM'
             LEFT JOIN BC_HIERARCHY E 
                    ON E.COMP_CD = A.COMP_CD
                   AND E.HIER_CD = SUBSTR(HIRCHY_CD, 0, 4)
                   AND E.HIER_TP = 'ITEM' 
                 WHERE A.COMP_CD = '2200'
                   AND A.STATUS = 'A'
                   AND (A.ITEM_CD LIKE '%'||'641571'||'%' OR A.ITEM_NM LIKE '%'||'641571'||'%')
                   AND A.ITEM_CD IN (
                                    SELECT F.ITEM_CD /* 456건 */
                                      FROM SD_CUST_ORDER_ITEM F 
                                      JOIN BC_CUST G 
                                        ON F.CUST_CD = G.CUST_CD
                                       AND F.COMP_CD = G.COMP_CD
                                     WHERE F.DATA_TP = 'RETURN'
                                       AND F.COMP_CD = '2200'
                                       AND (G.CUST_CD LIKE '%'||'1000313'||'%' OR G.CUST_NM LIKE '%'||'1000313'||'%') 
                                     ) 
                 ORDER BY E.HIER_NM
                        , D.HIER_NM
                        , C.HIER_NM
                        , A.ITEM_CD DESC

 

by 신이만든지기 [2024.04.22 15:29:01]

실행계획이 있다면 좋을 텐데요. in절을 콕찝어 느려진다고 말씀하신 것을 보아하니, 해당 구문을 빼면 빠르게 실행된다는 것으로 판단됩니다.

이에 의심되는 지점을 말씀드려봅니다.

A.ITEM_CD 

->  이 컬럼에 인덱스가 없다면 넣어보세요. 

 

 G.CUST_CD LIKE '%'||'1000313'||'%' OR G.CUST_NM LIKE '%'||'1000313'||'%'  

-> G.CUST_CD, G.CUST_NM 에 인덱스가 있나요? 있다면 '%키워드%' 구문은 인덱스를 사용하지 못합니다.

-> G.CUST_CD, G,CUST_NM 에 '키워드%' 한번 해보세요.(결과가 같다면)


by 통쓰 [2024.04.23 13:34:46]

엇 인덱스는 있습니다!

 '키워드%'  로 하니깐 바로 나와요 정말 감사합니다.

%키워드% 로하면 인덱스를 안타는지 처음 알았네요... 감사합니다!!


by 마농 [2024.04.23 01:30:19]

IN 은 EXISTS 나 JOIN 으로 변경 가능합니다.


by 통쓰 [2024.04.23 13:37:27]

한번 그걸로도 변경해보겠습니다!! 감사합니다!

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