쿼리 수행중 힌트 부분 수정에 따라 결과가 다르게 나와서 이런 경우 발생을 할 수 있는지 문의 드립니다.
플랜 확인시 는 access predicate / filter predicate 에서 조건절을 수행하는 차이는 거 같습니다.
1. use_nl 결과
WORK_DATE L_CODE M_CODE S_CODE WORK_DATE(1) L_CODE(1) M_CODE(1) S_CODE(1) READ_CNT
1 20230807 LD1 MD10 SD10 20230807 LD1 MD10 SD10 62730
2 20230807 LD1 MD10 SD20 20230807 LD1 MD10 SD20 57547
3 20230807 LD1 MD10 SD30
4 20230807 LD1 MD10 SD40
5 20230807 LD1 MD10 SD99
2. use_hash 결과
WORK_DATE L_CODE M_CODE S_CODE WORK_DATE(1) L_CODE(1) M_CODE(1) S_CODE(1) READ_CNT
1 20230807 LD1 MD10 SD10 20230807 LD1 MD10 SD10 62730
2 20230807 LD1 MD10 SD20 20230807 LD1 MD10 SD20 57547
3 20230807 LD1 MD10 SD40 20230807 LD1 MD10 SD40 462086
4 20230807 LD1 MD10 SD99 20230807 LD1 MD10 SD99 582363
5 20230807 LD1 MD10 SD30
WITH TB AS (
SELECT
NVL(PROCESSED_DATE,'20230807') AS WORK_DATE,
'LD1' AS L_CODE,
'MD10' AS M_CODE,
DECODE(NVL(SUBSTR(TBL,0,2),'TOTAL'),'01','SD10','02','SD20','03','SD30','05','SD40','TOTAL','SD99') AS S_CODE,
SUM(CNTT) AS READ_CNT
FROM TMP_SVC_TABLE
WHERE PROCESSED_DATE = '20230807'
GROUP BY ROLLUP((TBL,PROCESSED_DATE))
),
TA AS (
SELECT '20230807' AS WORK_DATE, 'LD1' AS L_CODE, 'MD10' AS M_CODE, 'SD10' AS S_CODE FROM DUAL union all
SELECT '20230807' AS WORK_DATE, 'LD1' AS L_CODE, 'MD10' AS M_CODE, 'SD20' AS S_CODE FROM DUAL union all
SELECT '20230807' AS WORK_DATE, 'LD1' AS L_CODE, 'MD10' AS M_CODE, 'SD30' AS S_CODE FROM DUAL union all
SELECT '20230807' AS WORK_DATE, 'LD1' AS L_CODE, 'MD10' AS M_CODE, 'SD40' AS S_CODE FROM DUAL union all
SELECT '20230807' AS WORK_DATE, 'LD1' AS L_CODE, 'MD10' AS M_CODE, 'SD99' AS S_CODE FROM DUAL )
SELECT /*+ use_nl(tb ta) */
*
--TA.*, NVL(TB.READ_CNT,0) AS READ_CNT
FROM TA, TB
WHERE TA.WORK_DATE = TB.WORK_DATE(+) AND TA.L_CODE = TB.L_CODE(+) AND TA.M_CODE = TB.M_CODE(+) AND TA.S_CODE = TB.S_CODE(+);
버그가 아닐런지요?