[IN 조건 사용시 조회바로 나옴]
SELECT BRANCH_CD,CUST_NO
FROM CR_ICP_DET_GRP_CUST A
WHERE A.BRANCH_CD = :1
AND A.CAMPAIGN_NO = :2
AND A.SEQ = :3
AND A.GROUP_SEQ = :4
AND A.CUST_NO IN (SELECT CR_CONVERT_CUST_NO(C_CUST_NO)
FROM CR_ICO_RESERVE AA
WHERE AA.BRANCH_CD = '1000'
AND NVL(AA.DEL_YN,'N') = 'N'
AND ( ( AA.RES_FR_DATE BETWEEN '20170301' AND '20170430' )
OR ( AA.RES_TO_DATE BETWEEN '20170301' AND '20170430' )
OR ( AA.RES_FR_DATE <= '20170301' AND '20170430' <= AA.RES_TO_DATE)
)
AND AA.STAY_YN = 'Y'
AND NVL(AA.C_CUST_NO,' ') <> ' '
AND EXISTS ( SELECT 1
FROM CM_TBO_CUSTGAME_DET X,
CM_TBO_TBL_MST Y
WHERE X.BRANCH_CD = Y.BRANCH_CD
AND X.TBL_CD = Y.TBL_CD
AND Y.SALESL = 'E'
AND X.BRANCH_CD = AA.BRANCH_CD
AND X.C_CUST_NO = AA.C_CUST_NO
AND X.SALES_DATE BETWEEN AA.RES_FR_DATE AND AA.RES_TO_DATE
AND X.DEL_YN = 'N')
GROUP BY AA.BRANCH_CD,AA.C_CUST_NO
HAVING COUNT(*) > 0 )
[위의 구문을 EXISTS로 바꿔봄 => 계속 조회중으로 나옴=> 너무 길어 계속 기다려보진 않음]
SELECT BRANCH_CD,CUST_NO
FROM CR_ICP_DET_GRP_CUST A
WHERE A.BRANCH_CD = :1
AND A.CAMPAIGN_NO = :2
AND A.SEQ = :3
AND A.GROUP_SEQ = :4
AND EXISTS (
SELECT 1
FROM CR_ICO_RESERVE AA
WHERE AA.BRANCH_CD = A.BRANCH_CD
AND AA.C_CUST_NO = CR_CONVERT_CUST_NO(A.CUST_NO)
AND AA.DEL_YN = 'N'
AND ( ( AA.RES_FR_DATE BETWEEN '20170301' AND '20170430' )
OR ( AA.RES_TO_DATE BETWEEN '20170301' AND '20170430' )
OR ( AA.RES_FR_DATE <= '20170301' AND '20170430' <= AA.RES_TO_DATE)
)
AND AA.STAY_YN = 'Y'
AND NVL(AA.C_CUST_NO,' ') <> ' '
AND ROWNUM = 1
AND EXISTS ( SELECT 1
FROM CM_TBO_CUSTGAME_DET X,
CM_TBO_TBL_MST Y
WHERE X.BRANCH_CD = Y.BRANCH_CD
AND X.TBL_CD = Y.TBL_CD
AND Y.SALESL = 'E'
AND X.BRANCH_CD = AA.BRANCH_CD
AND X.C_CUST_NO = AA.C_CUST_NO
AND X.SALES_DATE BETWEEN AA.RES_FR_DATE AND AA.RES_TO_DATE
AND X.DEL_YN = 'N')
GROUP BY AA.BRANCH_CD,AA.C_CUST_NO
HAVING COUNT(*) > 0 ) ;
위의 둘 차이가 뭐길래 EXISTS일때는 계속 조회중일까요?
1. 함수 사용 위치가 바뀐 듯 하네요.
- 기존쿼리에는 c_cust_no 에 함수 사용했는데
- 변경쿼리에는 a.cust_no 에 함수 사용하네요?
- 함수의 사용 위치 맞는지 확인하시구요.
- 함수의 역할이 뭔지? 꼭 사용해야 하는지?
- 사용자 함수를 내장 함수로 변경할수는 없는지?
- 등을 검토해 보세요.
2. 구간 검색 조건을 OR 로 복잡하게 작성하셨는데요?
- 간단하게 시작과 종료를 교차비교하면 됩니다.
- AND aa.res_fr_date <= '20170430'
- AND aa.res_to_date >= '20170301'
3. 수행 시간의 차이는
- 실행계획을 비교해 보세요.