안녕하세요
테이블 조인시 where 조건에 따른 실행계획 변화에 대한 질문을 드립니다
아래 쿼리에 대한 실행계획은 첨부파일1 '조건전 실행계획' 처럼 표시 되며 1초 미만으로 조회결과가 나옵니다.
그런데 주석처리 되어있는 AND M1.NACC200_BILL_STS_CD = '60' 조건을 추가하면 실행계획도 변하고 조회 시간도 10분정도로 증가합니다.
M1.NACC200_BILL_STS_CD = '60' 조건을 확인하기 위한 랜덤액세스 때문일까 라는 생각이 들어 인덱스를 추가해 보았지만 실행계획의 큰 틀은 변하지 않았습니다.
힌트 추가등을 통해 M1.NACC200_BILL_STS_CD = '60' 조건 추가 전의 실행계획 형태로 사용이 가능한지 아니면 전체적인 접근 법이 잘못된 것인지 판단이 안되서 문의 드립니다.
SELECT
/*+ORDERED */
D1.NACC210_ACT_CD AS ACT_CD,
D1.NACC210_CAMPUS_CD AS CAMPUS_CD,
D1.NACC210_ACC_DIV_CD AS ACC_DIV_CD,
C1.NACC050_DC_DIV_CD AS DC_DIV_CD,
DECODE(D1.NACC210_DC_DIV_CD, 'D', D1.NACC210_AMT, 0) AS DR_AMT,
DECODE(D1.NACC210_DC_DIV_CD, 'C', D1.NACC210_AMT, 0) AS CR_AMT
FROM NACC050TL C1, NACC210TL D1, NACC200TL M1
WHERE 1=1
AND C1.NACC050_ACC_YEAR < '2018'
AND C1.NACC050_ACC_YEAR >= '2014'
AND DECODE(C1.NACC050_ACC_UNIT_CD, '03', '16', C1.NACC050_ACC_UNIT_CD) IN (SELECT COLUMN_VALUE FROM TABLE(f_nacc_split_array('01,02,03,04,05,06'',')))
AND SUBSTR(C1.NACC050_ACT_CD, 1, 4) IN ('1123', '2141')
AND C1.NACC050_ACT_CD NOT IN ('1123007', '2141003')
AND D1.NACC210_ACC_YEAR = C1.NACC050_ACC_YEAR
AND D1.NACC210_ACC_UNIT_CD = C1.NACC050_ACC_UNIT_CD
AND D1.NACC210_CAMPUS_CD LIKE :as_p_campus_cd_param || '%'
AND D1.NACC210_ACC_DIV_CD LIKE :as_p_acc_div_cd_param || '%'
AND D1.NACC210_ACT_CD = C1.NACC050_ACT_CD
AND M1.NACC200_BILL_NO = D1.NACC210_BILL_NO
-- AND M1.NACC200_BILL_STS_CD = '60'
AND 'N' =F_NACC_IN_TRAD_YN(:as_p_campus_cd_param,:as_p_setac_grp_div_cd_param,:as_p_acc_div_cd_param,
D1.NACC210_INTRD_CAMPUS_CD, D1.NACC210_INTRD_ACC_UNIT_CD, D1.NACC210_INTRD_ACC_DIV_CD)
답변 너무 감사드립니다. 조인에만 너무 집착해서 다른 접근법은 고려를 하지 못했네요
한가지만 더 여쭤보자면 ..
마농님 답변 내용 중 m1 조건이 추가되면서 hash unique 실행 시기가 뒤로 미뤄진 이유가 뭔지 궁금합니다.
hash unique 와 view view 실행계획은 c1의 where 조건의 서브쿼리와 상관있는 것이고
ordered를 힌트를 통해 가장 먼저 처리가 되는 것으로 이해를 했습니다.
그래서 m1의 변화와는 상관없이 계속 가장 먼저 처리가 될 것으로 생각을 했는데 where 조건 추가 후 실행계획이 확 변해서... 그 이유가 궁금합니다.
아 그리고 ordered 힌트를 쓴 이유는 c1의 조건으로 f_nacc_split_arrary 함수가 들어간 서브쿼리를 쓰는데 이게 힌트를 안주면 실행순서가 뒤로 빠지면서 속도가 안 나왔습니다.
c1의 결과가 백단위이고 d1은 십만단위라서 저런 순서로 계획을 했습니다.