테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
리스크팀의 「대량 구매 모니터」는 5분마다 상품 280개를 차례로 돌며, 한 번에 10개 이상 산 주문상품 줄을 찾는다. 재판매 업자를 걸러 내려는 것이다. 상품 하나에 한 번씩이니 하루 약 8만 번 실행된다.
상품 상세 화면용으로 만든 product_id 인덱스를 타는데, 상품 하나에서 서너 줄을 찾는 데 170블록 넘게 읽는다. 아래는 상품 57이다.
order_items 주문상품: 73,498행 · 290블록(블록당 약 253행) · order_item_id 순으로 쌓였다(주문이 들어온 순서) · 한 상품의 줄은 테이블 전체에 흩어져 있다product_id 280종(상품당 약 262줄) · 이 문제에서는 quantity가 대부분 1 ~ 5이고 10개 이상은 약 1%라고 둔다quantity >= 10은 3줄IX_OI_PROD (product_id): 상품 상세 화면용 · BLEVEL 1 · 리프 약 160 · CLUSTERING_FACTOR 약 72,000 · 통계 최신 · 주문이 들어올 때마다 주문상품이 INSERT된다SELECT order_item_id, order_id, quantity, unit_price
FROM order_items
WHERE product_id = :p
AND quantity >= 10
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 3 |00:00:00.01 | 174 |
|* 1 | TABLE ACCESS BY INDEX ROWID BATCHED | ORDER_ITEMS | 1 | 3 | 3 |00:00:00.01 | 174 |
|* 2 | INDEX RANGE SCAN | IX_OI_PROD | 1 | 262 | 262 |00:00:00.01 | 2 |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("QUANTITY">=10)
2 - access("PRODUCT_ID"=:P)