테마
버거원 상품기획팀은 두 화면을 쓴다. 「상품 일 판매」는 날짜와 상품 하나를 골라 판매 수량을 보고, 「상품 월간 추이」는 상품 하나의 한 달 일별 판매 수량을 그린다. 둘 다 하루 수백 번 연다. 조민우가 두 화면을 위한 인덱스 요청서를 올렸다. "(ORD_DT, ITEM_ID, ORD_ITEM_QTY). ORD_DT는 730종, ITEM_ID는 92종이므로 선택도가 좋은 ORD_DT를 앞에 둔다." INVISIBLE로 만들어 재 보니 일 판매는 4블록인데 월간 추이는 345블록이다.
ORD_ITEM 주문상품: 2,472,717행 · 55,265블록 · 주문 날짜순으로 적재 · ITEM_ID 1 ~ 92에 고르게 분포(상품당 약 26,900행, 하루 약 37행) · ORD_DT VARCHAR2(8) 2012 ~ 2013 · 2013년 11월 약 102,900행ITEM_ID = 84: 2013년 11월 1,121행ORD_ITEM_PK (ORD_NO, ITEM_ID) · ORD_ITEM_X01 (ORD_DT, ORD_HMS)(CF 좋음)ORD_ITEM_X02 (ORD_DT, ITEM_ID, ORD_ITEM_QTY): INVISIBLE · BLEVEL 2 · 리프 약 8,500블록(리프 한 블록에 약 290항목)-- S1 「상품 일 판매」
SELECT SUM(ORD_ITEM_QTY) AS qty, COUNT(*) AS line_cnt
FROM ORD_ITEM
WHERE ORD_DT = :v_dt
AND ITEM_ID = :v_item;
-- S2 「상품 월간 추이」
SELECT ORD_DT, SUM(ORD_ITEM_QTY) AS qty
FROM ORD_ITEM
WHERE ITEM_ID = :v_item
AND ORD_DT BETWEEN :v_from AND :v_to
GROUP BY ORD_DT
ORDER BY ORD_DT;
-- 요청서
CREATE INDEX ORD_ITEM_X02 ON ORD_ITEM (ORD_DT, ITEM_ID, ORD_ITEM_QTY) INVISIBLE;
[지금 — 요청서 인덱스 없이] S1 ORD_ITEM_X01 + 테이블에서 상품을 거른다 91 · S2 ORD_ITEM_X01 + 테이블 2,648
[요청서 X02 · 세션에서만 — S1 (2013-11-02, 상품 84)]
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 4 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 4 |
|* 2 | INDEX RANGE SCAN | ORD_ITEM_X02 | 1 | 37 | 38 |00:00:00.01 | 4 |
-----------------------------------------------------------------------------------------------
2 - access("ORD_DT"=:V_DT AND "ITEM_ID"=:V_ITEM)
[요청서 X02 · 세션에서만 — S2 (2013년 11월, 상품 84)]
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 30 |00:00:00.02 | 345 |
| 1 | SORT GROUP BY NOSORT| | 1 | 41 | 30 |00:00:00.02 | 345 |
|* 2 | FILTER | | 1 | | 1121 |00:00:00.02 | 345 |
|* 3 | INDEX RANGE SCAN| ORD_ITEM_X02 | 1 | 41 | 1121 |00:00:00.02 | 345 |
-----------------------------------------------------------------------------------------------
2 - filter(:V_FROM<=:V_TO)
3 - access("ORD_DT">=:V_FROM AND "ITEM_ID"=:V_ITEM AND "ORD_DT"<=:V_TO)
filter("ITEM_ID"=:V_ITEM)