테마
회계 규정상 매출 인식일은 결제일이고, 아직 결제되지 않은 주문은 주문일로 잡는다. 정산팀 「일별 매출 인식」 화면은 이 규정을 NVL 하나로 옮겼다. 정산 담당 8명이 하루 종일 날짜를 바꿔 가며 보고, 매시 정각에는 대사 배치가 최근 7일을 다시 센다. 박팀장은 이렇게 주문했다. "인덱스는 둘 다 있다는데 왜 안 쓰는지, 고칠 방법이 여럿이면 비교해서 하나를 골라 와."
T_ORD: 100,000행 · 896블록 · 하루 136 ~ 137건이 서로 다른 블록에 흩어져 있다ORD_DT DATE(시분초 있음) · PAY_DT DATE(결제일, 결제 전이면 NULL · 지금 미결제 41건)
(문제 설정: 2024년 12월 결제 연동 개편 뒤의 모습이다. IDX-004와 같다)IX_T_ORD_DT (ORD_DT) · IX_T_ORD_PAY (PAY_DT): 둘 다 BLEVEL 1 · 리프 265 · 통계 최신PAY_DT를 UPDATE한다. 적재 배치 일부는 INSERT INTO T_ORD VALUES (...)처럼 컬럼 목록 없이 넣는다SELECT COUNT(*) AS cnt, SUM(ORD_AMT) AS amt
FROM T_ORD
WHERE NVL(PAY_DT, ORD_DT) >= TO_DATE(:v_dt, 'YYYYMMDD')
AND NVL(PAY_DT, ORD_DT) < TO_DATE(:v_dt, 'YYYYMMDD') + 1
------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.02 | 896 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.02 | 896 |
|* 2 | FILTER | | 1 | | 137 |00:00:00.02 | 896 |
|* 3 | TABLE ACCESS FULL| T_ORD | 1 | 250 | 137 |00:00:00.02 | 896 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(TO_DATE(:V_DT,'YYYYMMDD')+1>TO_DATE(:V_DT,'YYYYMMDD'))
3 - filter((NVL("PAY_DT","ORD_DT")>=TO_DATE(:V_DT,'YYYYMMDD') AND
NVL("PAY_DT","ORD_DT")<TO_DATE(:V_DT,'YYYYMMDD')+1))