테마
정산팀 「일별 주문 목록」은 주문일(필수)과 결제수단(옵션, 기본값 「전체」)으로 조회한다. 지난주 조민우가 "OR가 있으면 인덱스를 못 탄다"며 결제수단 조건을 NVL로 바꿔 배포했다.
그 뒤로 「전체」로 보면 결제 대기 주문이 빠진다는 문의가 들어왔다. 화면 속도는 배포 전과 달라진 게 없다고 한다.
T_ORD 주문: 100,000행 · 896블록 · 주문 순으로 쌓였다 · ORD_DT DATE(시분초 있음, 하루 136 ~ 137건) · PAY_TP 결제수단(CARD 70% · BANK 20% · PHONE 7% · POINT 3%, 결제 전이면 NULL) · PAY_DT · ORD_AMTIX_T_ORD_DT (ORD_DT): BLEVEL 1 · 통계 최신 · PAY_TP에는 인덱스가 없다-- [배포 전]
SELECT ORD_SEQ, CUS_ID, ORD_DT, PAY_TP, ORD_AMT
FROM T_ORD
WHERE ORD_DT >= TO_DATE(:v_dt, 'YYYYMMDD')
AND ORD_DT < TO_DATE(:v_dt, 'YYYYMMDD') + 1
AND (:v_tp IS NULL OR PAY_TP = :v_tp)
ORDER BY ORD_DT;
-- [배포 후] 조민우
SELECT ORD_SEQ, CUS_ID, ORD_DT, PAY_TP, ORD_AMT
FROM T_ORD
WHERE ORD_DT >= TO_DATE(:v_dt, 'YYYYMMDD')
AND ORD_DT < TO_DATE(:v_dt, 'YYYYMMDD') + 1
AND PAY_TP = NVL(:v_tp, PAY_TP)
ORDER BY ORD_DT;
[배포 전 · 2024-12-30 · 「전체」(:v_tp NULL)]
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 137 | 00:00:00.01 | 4 |
|* 1 | TABLE ACCESS BY INDEX ROWID | T_ORD | 1 | 137 | 137 | 00:00:00.01 | 4 |
|* 2 | INDEX RANGE SCAN | IX_T_ORD_DT | 1 | 137 | 137 | 00:00:00.01 | 2 |
-------------------------------------------------------------------------------------------------------
1 - filter((:V_TP IS NULL OR "PAY_TP"=:V_TP))
2 - access("ORD_DT">=TO_DATE(:V_DT,'YYYYMMDD') AND "ORD_DT"<TO_DATE(:V_DT,'YYYYMMDD')+1)
[배포 후 · 같은 날 · 「전체」]
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 128 | 00:00:00.01 | 4 |
|* 1 | TABLE ACCESS BY INDEX ROWID | T_ORD | 1 | 137 | 128 | 00:00:00.01 | 4 |
|* 2 | INDEX RANGE SCAN | IX_T_ORD_DT | 1 | 137 | 137 | 00:00:00.01 | 2 |
-------------------------------------------------------------------------------------------------------
1 - filter("PAY_TP"=NVL(:V_TP,"PAY_TP"))
2 - access("ORD_DT">=TO_DATE(:V_DT,'YYYYMMDD') AND "ORD_DT"<TO_DATE(:V_DT,'YYYYMMDD')+1)
col = NVL(:v, col) 모양을 써도 되는 컬럼과 안 되는 컬럼을 구분하고, 옵션 조건을 갈래로 나눌 가치가 있는 경우를 설명하시오.