테마
유통 매장 POS의 「시각으로 영수증 찾기」는 손님이 영수증을 잃어버리고 "오늘 오후 2시쯤 샀다"고 할 때 쓴다. 계산원이 날짜와 시각 범위를 넣으면 그 시간대 영수증이 뜬다. 매장 다섯 곳에서 하루 수백 번 쓴다. 지난주 1003 매장에서 다른 매장 영수증으로 반품을 받을 뻔한 일이 있었다. 개발자는 "실행계획을 보면 점장 앱용 인덱스를 잘 탄다. 성능은 문제없다"고 한다. 아래는 1003 매장 POS에서 2023-06-01 14시대를 찾았을 때다.
CF10 판매: 500,000행 · 4,583블록 · 판매 날짜순으로 쌓였다 · SLE_DT VARCHAR2(8) · SLE_HMS VARCHAR2(6) · SHP_NO NUMBER(5) 1001 ~ 1005 · 모든 컬럼 NOT NULLCF10_PK (SLE_NO) · IX_CF10_SHP_DT_HMS (SHP_NO, SLE_DT, SLE_HMS): 점장 앱 「시간대 판매」용 · BLEVEL 2 · 리프 약 1,600블록 · 통계 최신:v_shp로 들고 있다SELECT h.SLE_NO, h.SLE_HMS, h.SHP_NO
FROM CF10 h
WHERE h.SLE_DT = :v_dt
AND h.SLE_HMS BETWEEN :v_hms_from AND :v_hms_to
ORDER BY h.SLE_HMS
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 58 |00:00:00.01 | 22 |
| 1 | SORT ORDER BY | | 1 | 44 | 58 |00:00:00.01 | 22 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| CF10 | 1 | 44 | 58 |00:00:00.01 | 22 |
|* 3 | INDEX SKIP SCAN | IX_CF10_SHP_DT_HMS | 1 | 44 | 58 |00:00:00.01 | 16 |
-----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("H"."SLE_DT"=:V_DT AND "H"."SLE_HMS">=:V_HMS_FROM AND "H"."SLE_HMS"<=:V_HMS_TO)
filter(("H"."SLE_DT"=:V_DT AND "H"."SLE_HMS">=:V_HMS_FROM AND "H"."SLE_HMS"<=:V_HMS_TO))
INDEX SKIP SCAN이 이 SQL에 대해 무엇을 알려 주는지 설명하고, 다른 매장 영수증이 섞여 나온 이유를 설명하시오.