테마
매장 운영팀의 「단체 주문 알림」은 오늘 들어온 주문 가운데 상품을 4종 이상 담은 주문을 매장별로 센다. 매장 지원 담당자들이 하루 수십 번 새로 고치는데, 한 번에 2초 가까이 걸리고 그때마다 TEMP를 30MB 넘게 쓴다. 개발자는 "IN 서브쿼리는 오라클이 알아서 조인으로 펼쳐 준다고 들었다"라고 한다.
ORD 주문: 1,000,000행 · 22,422블록 · ORD_PK (ORD_NO) · ORD_X01 (ORD_DT, ORD_HMS) (하루치가 약 31블록에 모여 있다)ORD_ITEM 주문상품: 2,472,717행 · 55,265블록 · ORD_ITEM_PK (ORD_NO, ITEM_ID) (리프 약 6,200블록, 높이 3) · ORD_ITEM_X01 (ORD_DT, ORD_HMS) (하루치가 약 76블록에 모여 있다) · 주문당 1~4종 · ORD_DT는 주문 헤더의 날짜를 그대로 복사한 값이다SELECT o.SHOP_NO, COUNT(*) AS big_ord_cnt
FROM ORD o
WHERE o.ORD_DT = :dt
AND o.ORD_NO IN (SELECT i.ORD_NO
FROM ORD_ITEM i
GROUP BY i.ORD_NO
HAVING COUNT(*) >= 4)
GROUP BY o.SHOP_NO
--------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | Used-Mem | Used-Tmp |
--------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 161 |00:00:01.94 | 6268 | 4113 | | |
| 1 | HASH GROUP BY | | 1 | 200 | 161 |00:00:01.94 | 6268 | 4113 | 1155K (0)| |
|* 2 | HASH JOIN | | 1 | 1370 | 320 |00:00:01.94 | 6268 | 4113 | 1264K (0)| |
| 3 | TABLE ACCESS BY INDEX ROWID BATCHED| ORD | 1 | 1370 | 1368 |00:00:00.01 | 37 | 0 | | |
|* 4 | INDEX RANGE SCAN | ORD_X01 | 1 | 1370 | 1368 |00:00:00.01 | 6 | 0 | | |
| 5 | VIEW | VW_NSO_1 | 1 | 50000 | 231K|00:00:01.90 | 6231 | 4113 | | |
|* 6 | HASH GROUP BY | | 1 | 50000 | 231K|00:00:01.88 | 6231 | 4113 | 38M (1)| 33M |
| 7 | INDEX FAST FULL SCAN | ORD_ITEM_PK | 1 | 2472K| 2472K|00:00:00.42 | 6231 | 0 | | |
--------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("O"."ORD_NO"="ORD_NO")
4 - access("O"."ORD_DT"=:DT)
6 - filter(COUNT(*)>=4)