테마
버거 본사의 「일 마감 주문 점검」은 날짜를 고르면 그날 전 매장 주문을 주문별 품목 수와 수량 합계와 함께 보여 준다. 마감 담당이 매일 밤 여러 번 열고, 감사팀은 지난 날짜를 하루에 수백 번 넘겨 본다.
DBA가 보니 실행계획에 VIEW PUSHED PREDICATE가 있었다. 오과장은 "조인 조건을 뷰 안으로 밀어 넣는 좋은 변환이라던데 5,500블록이나 읽는다. 그날 주문상품은 3,381줄뿐이다"라고 한다.
ORD 주문: 1,000,000행 · 22,422블록 · ORD_X01 (ORD_DT, ORD_HMS): 날짜순 적재 · 하루치 약 1,370건이 31블록에 모여 있다ORD_ITEM 주문상품: 2,472,717행 · 55,265블록 · ORD_ITEM_PK (ORD_NO, ITEM_ID) 높이 3 · ORD_ITEM_X01 (ORD_DT, ORD_HMS) · 주문번호 순(곧 날짜순)으로 쌓여 하루치가 약 76블록에 모여 있다 · 한 주문의 상품은 한 블록에 있다ORD_ITEM의 ORD_DT와 ORD_HMS는 주문 헤더의 값을 그대로 복사한 컬럼이다(적재 프로그램이 함께 넣는다)SELECT o.ORD_NO, o.SHOP_NO, o.ORD_HMS, v.ITEM_CNT, v.QTY
FROM ORD o,
(SELECT ORD_NO, COUNT(*) AS ITEM_CNT, SUM(ORD_ITEM_QTY) AS QTY
FROM ORD_ITEM
GROUP BY ORD_NO) v
WHERE o.ORD_DT = :dt
AND v.ORD_NO = o.ORD_NO
ORDER BY o.SHOP_NO, o.ORD_HMS
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1368 |00:00:00.05 | 5509 | |
| 1 | SORT ORDER BY | | 1 | 1370 | 1368 |00:00:00.05 | 5509 | 124K (0)|
| 2 | NESTED LOOPS | | 1 | 1370 | 1368 |00:00:00.05 | 5509 | |
| 3 | TABLE ACCESS BY INDEX ROWID BATCHED| ORD | 1 | 1370 | 1368 |00:00:00.01 | 37 | |
|* 4 | INDEX RANGE SCAN | ORD_X01 | 1 | 1370 | 1368 |00:00:00.01 | 6 | |
| 5 | VIEW PUSHED PREDICATE | | 1368 | 1 | 1368 |00:00:00.04 | 5472 | |
| 6 | SORT GROUP BY | | 1368 | 1 | 1368 |00:00:00.03 | 5472 | |
| 7 | TABLE ACCESS BY INDEX ROWID | ORD_ITEM | 1368 | 2 | 3381 |00:00:00.02 | 5472 | |
|* 8 | INDEX RANGE SCAN | ORD_ITEM_PK | 1368 | 2 | 3381 |00:00:00.01 | 4104 | |
----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("O"."ORD_DT"=:DT)
8 - access("ORD_NO"="O"."ORD_NO")
VIEW PUSHED PREDICATE가 나은 경우를 쓰시오.