안녕하세요! 언제나 고생이 많으십니다!!
아래와 같이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
실행계획이 있다면 좋을 텐데요. 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 에 '키워드%' 한번 해보세요.(결과가 같다면)
엇 인덱스는 있습니다!
'키워드%' 로 하니깐 바로 나와요 정말 감사합니다.
%키워드% 로하면 인덱스를 안타는지 처음 알았네요... 감사합니다!!
IN 은 EXISTS 나 JOIN 으로 변경 가능합니다.
한번 그걸로도 변경해보겠습니다!! 감사합니다!