테마
버거원 상품기획팀의 「시간대별 메뉴 판매」는 기간(보통 한 달)을 고르면 시간대와 메뉴별 판매 수량을 표로 보여 준다. 하루 수십 번 열고, 한 달을 고르면 2,700블록 가까이 읽는다. 조민우는 "GROUP BY에 SUBSTR(ORD_HMS, 1, 2)가 있으니 그 식으로 인덱스를 만들면 된다"며 지난주 함수 기반 인덱스를 만들었다. 그런데 실행계획은 그대로이고, 운영팀은 POS 주문상품 INSERT가 고치는 인덱스가 하나 늘었다고 알려 왔다.
ORD_ITEM 주문상품: 2,472,717행 · 55,265블록 · 주문 시각 순으로 쌓였다 · 한 달 약 103,000행 · POS가 하루 약 3,400행 INSERTORD_ITEM_PK (ORD_NO, ITEM_ID) · ORD_ITEM_X01 (ORD_DT, ORD_HMS): BLEVEL 2 · 리프 약 9,200블록 · CLUSTERING_FACTOR 약 55,100 · 「일별 주문 조회」도 쓴다ORD_ITEM_FX01 (SUBSTR(ORD_HMS, 1, 2), ITEM_ID): 리프 약 5,700블록 · 통계 최신SELECT SUBSTR(ORD_HMS, 1, 2) AS hh, ITEM_ID, SUM(ORD_ITEM_QTY) AS qty
FROM ORD_ITEM
WHERE ORD_DT BETWEEN :v_from AND :v_to
GROUP BY SUBSTR(ORD_HMS, 1, 2), ITEM_ID;
-- 지난주 조민우
CREATE INDEX ORD_ITEM_FX01 ON ORD_ITEM (SUBSTR(ORD_HMS, 1, 2), ITEM_ID);
[2013년 11월 · FX01을 만든 뒤에도 같다]
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1288 |00:00:00.09 | 2690 |
| 1 | HASH GROUP BY | | 1 | 1288 | 1288 |00:00:00.09 | 2690 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| ORD_ITEM | 1 | 98K | 103K |00:00:00.06 | 2690 |
|* 3 | INDEX RANGE SCAN | ORD_ITEM_X01 | 1 | 98K | 103K |00:00:00.02 | 387 |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("ORD_DT">=:V_FROM AND "ORD_DT"<=:V_TO)