테마
현금 결제 주문은 입금을 기다리는 동안 상품 재고를 잡아 둔다. 30분 안에 입금되지 않으면 1분마다 도는 정리 작업이 그 주문을 취소해 재고를 푼다. 한 번에 바뀌는 주문은 보통 0 ~ 2건이다. 오픈할 때는 몇 블록이면 끝났는데, 2년이 지난 지금은 한 번에 400블록 넘게 읽는다. 오과장은 이렇게 묻는다. "바뀌는 건 한두 건인데 왜 해마다 무거워지나?"
T_ORD: 100,000행 · 896블록 · ORD_DT DATE(시분초 있음, 2023 ~ 2024, 하루 약 137건) · PAY_TP CARD · CASH · POINT가 1/3씩 · ORD_ST COMPLETE · PENDING · CANCELPK_T_ORD (ORD_SEQ) · IX_T_ORD_DT_ST_TP (ORD_DT, ORD_ST, PAY_TP): 「일자별 상태·결제수단 현황」용 · BLEVEL 1 · 리프 약 417블록(리프 한 블록에 약 240항목) · 통계 최신 · ORD_ST에 히스토그램UPDATE T_ORD
SET ORD_ST = 'CANCEL'
WHERE ORD_ST = 'PENDING'
AND PAY_TP = 'CASH'
AND ORD_DT < SYSDATE - 30/1440
[한 번 실행 — 기한이 지난 현금 대기 주문 1건]
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | | 0 |00:00:00.01 | 425 |
| 1 | UPDATE | T_ORD | 1 | | 0 |00:00:00.01 | 425 |
|* 2 | INDEX RANGE SCAN | IX_T_ORD_DT_ST_TP | 1 | 2 | 1 |00:00:00.01 | 418 |
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ORD_DT"<SYSDATE@!-.0208333333333333333333333333333333333333 AND "ORD_ST"='PENDING' AND
"PAY_TP"='CASH')
filter(("ORD_ST"='PENDING' AND "PAY_TP"='CASH'))
ORD_DT >= SYSDATE - 1처럼 좁혀 쓰는 방법의 문제도 설명하시오.