테마
본사 감사팀은 매달 초 지난달 판매상품 원장을 출력한다. 출력 프로그램은 먼저 CF10에서 지난달 판매번호 목록을 받고, 그 번호를 1,000개씩 묶어 CF11에 IN 목록으로 보낸다. 2023년 12월은 판매가 20,864건이라 스물한 번 보냈다.
개발자는 이렇게 설명했다. "IN에는 1,000개까지만 넣을 수 있어서(ORA-01795) 나눴다. PK로 한 건씩 정확히 찾으니 가장 빠르다." 그런데 출력에 1분이 넘게 걸리고, 그동안 매장 POS의 판매 등록이 느려진다는 말이 나온다.
CF11 판매상품: 1,096,708행 · 8,204블록(블록당 약 134행) · 판매번호 순으로 쌓였다 · SLE_NO는 'YYYYMMDD-NNNN'(앞 8자리가 판매일) · 영수증 한 장에 평균 2.2줄 · 2023년 12월 46,322줄CF11_PK (SLE_NO, ITM_NO): BLEVEL 2 · 리프 약 4,290블록(리프 한 블록에 약 256항목) · CLUSTERING_FACTOR 16,735 · 통계 최신CF10 판매: 2023년 12월 20,864건 · CF10_PK (SLE_NO)-- 출력 프로그램 · 판매번호 1,000개씩 (2023년 12월은 21번)
SELECT SUBSTR(SLE_NO, 1, 8) AS sle_dt, SLE_NO, ITM_NO, SLE_QTY, SLE_UPRC,
SLE_QTY * SLE_UPRC AS sle_amt
FROM CF11
WHERE SLE_NO IN (:b1, :b2, :b3, /* … */ :b1000)
ORDER BY SLE_NO, ITM_NO
[한 번 · 판매번호 1,000개 · 2,212줄]
--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 2212 |00:00:02.91 | 4058 | 1203 |
| 1 | INLIST ITERATOR | | 1 | | 2212 |00:00:02.91 | 4058 | 1203 |
| 2 | TABLE ACCESS BY INDEX ROWID| CF11 | 1000 | 2200 | 2212 |00:00:02.88 | 4058 | 1203 |
|* 3 | INDEX RANGE SCAN | CF11_PK | 1000 | 2200 | 2212 |00:00:00.41 | 3012 | 188 |
--------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access(("SLE_NO"=:B1 OR "SLE_NO"=:B2 OR … OR "SLE_NO"=:B1000))
[2023년 12월 · 스물한 번 합계] Buffers 약 85,000 · Reads 약 25,000 · 경과 1분 3초