테마
유통 본사 「기간 판매 현황」 화면에는 조회 단위 라디오 버튼(일, 월, 연)과 입력칸 하나가 있다. 일이면 '20230601', 월이면 '202306', 연이면 '2023'을 넣는다. 개발자는 단위마다 SQL을 따로 두기 싫어 DECODE 하나로 묶었다.
MD와 매장 관리자가 하루 수백 번 조회한다. 아래는 월 단위(:v_unit = 'M', :v_key = '202306')로 조회했을 때다.
CF10 판매: 500,000행 · 4,583블록(전체 스캔 4,510) · SLE_DT VARCHAR2(8) '20220101' ~ '20231231'(길이 8 고정) · SHP_NO 매장 5곳IX_CF10_SLE_DT (SLE_DT): BLEVEL 2 · 리프 1,393 · CF 9,921 · CF10_PK (SLE_NO) · 통계 최신SELECT SHP_NO, COUNT(*) AS sle_cnt
FROM CF10
WHERE DECODE(:v_unit, 'D', SLE_DT,
'M', SUBSTR(SLE_DT, 1, 6),
'Y', SUBSTR(SLE_DT, 1, 4)) = :v_key
GROUP BY SHP_NO
-----------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 5 |00:00:00.06 | 4510 |
| 1 | HASH GROUP BY | | 1 | 5 | 5 |00:00:00.06 | 4510 |
|* 2 | TABLE ACCESS FULL| CF10 | 1 | 5000 | 20953 |00:00:00.05 | 4510 |
-----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(DECODE(:V_UNIT,'D',"SLE_DT",'M',SUBSTR("SLE_DT",1,6),'Y',SUBSTR("SLE_DT",1,4))=:V_KEY)
:v_unit이 바인드 변수인데도 이 조건이 인덱스를 쓰지 못하는 이유를 설명하시오.IX_CF10_SLE_DT 범위 스캔이 되도록 하시오. 연 단위도 같은 계획으로 읽는 것이 맞는지 숫자로 따져 설명하시오.