테마
정산팀은 매일 아침 PG사가 보낸 「금액 불일치 주문」 목록을 받아 「주문번호 일괄 조회」 화면에 주문번호를 몇 개씩 붙여 넣는다. 보통 다섯 개 안팎이고 많으면 스무 개다. 화면은 기간 칸에 최근 석 달을 기본값으로 채워 함께 보낸다. 정산 담당 열 명이 하루 약 1,500번 조회한다. 개발자는 주문번호를 IN 목록으로 넘기니 INLIST ITERATOR가 번호마다 찾아갈 것이라고 했다. 그런데 주문 다섯 건을 찾는 데 335블록을 읽는다. 아래는 2024년 10 ~ 12월을 기간으로 다섯 건을 찾았을 때다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_DT 하루 913건(전부 자정) · 2024년 10 ~ 12월 83,996건(92일)ORD_SEQ는 값이 겹치지 않는다. 하지만 PK도 유니크 제약도 없다(교재 데이터 그대로)IX_ORD_BIG_DT_SEQ_AMT (ORD_DT, ORD_SEQ, ORD_AMT): 「정산 목록」 키 기반 페이징과 「기간 매출」이 쓴다(ACC-069) · BLEVEL 2 · 리프 약 3,890블록(리프 한 블록에 약 257항목) · CLUSTERING_FACTOR 약 1,000,000 · 통계 최신SELECT ORD_SEQ, CUS_ID, ORD_DT, ORD_ST, ORD_AMT
FROM T_ORD_BIG
WHERE ORD_DT >= TO_DATE(:v_from, 'YYYYMMDD')
AND ORD_DT < TO_DATE(:v_to, 'YYYYMMDD') + 1
AND ORD_SEQ IN (:n1, :n2, :n3, :n4, :n5)
------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 5 |00:00:00.01 | 335 |
|* 1 | FILTER | | 1 | | 5 |00:00:00.01 | 335 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED | T_ORD_BIG | 1 | 1 | 5 |00:00:00.01 | 335 |
|* 3 | INDEX RANGE SCAN | IX_ORD_BIG_DT_SEQ_AMT | 1 | 1 | 5 |00:00:00.01 | 330 |
------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_DATE(:V_TO,'YYYYMMDD')+1>TO_DATE(:V_FROM,'YYYYMMDD'))
3 - access("ORD_DT">=TO_DATE(:V_FROM,'YYYYMMDD') AND "ORD_DT"<TO_DATE(:V_TO,'YYYYMMDD')+1)
filter(("ORD_SEQ"=:N1 OR "ORD_SEQ"=:N2 OR "ORD_SEQ"=:N3 OR "ORD_SEQ"=:N4 OR "ORD_SEQ"=:N5))