테마
버거원 가맹점주 앱의 「우리 매장 주문 추이」는 자기 매장의 최근 석 달 일별 주문 건수를 보여 준다. 가맹점 200곳이 하루에 수십 번씩 연다.
옵티마이저는 04화에서 월마감용으로 들인 커버링 인덱스 ORD_RANDOM_X02를 골랐고, 테이블에는 가지 않는다. 그런데 매장 하나의 641건을 세는 데 인덱스를 475블록이나 읽는다.
ORD_RANDOM: 1,000,000행 · 22,414블록 · ORD_DT VARCHAR2(8) 2012 ~ 2013 · 한 달 약 41,666건 · SHOP_NO 'SH0001' ~ 'SH0200'(고르게 분포)ORD_RANDOM_X01 (ORD_DT, ORD_HMS) · ORD_RANDOM_X02 (ORD_DT, SHOP_NO): X02는 BLEVEL 2 · 리프 3,774 · 04화 T2 승인 뒤 VISIBLE · 월마감 「가맹점별 주문 건수」(ORD_DT BETWEEN … GROUP BY SHOP_NO, 한 달 160블록)가 쓴다SELECT ORD_DT, COUNT(*) AS ord_cnt
FROM ORD_RANDOM
WHERE SHOP_NO = :v_shop
AND ORD_DT BETWEEN :v_from AND :v_to
GROUP BY ORD_DT
ORDER BY ORD_DT
---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 92 |00:00:00.01 | 475 |
| 1 | SORT GROUP BY NOSORT | | 1 | 61 | 92 |00:00:00.01 | 475 |
|* 2 | FILTER | | 1 | | 641 |00:00:00.01 | 475 |
|* 3 | INDEX RANGE SCAN | ORD_RANDOM_X02 | 1 | 61 | 641 |00:00:00.01 | 475 |
---------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(:V_FROM<=:V_TO)
3 - access("ORD_DT">=:V_FROM AND "SHOP_NO"=:V_SHOP AND "ORD_DT"<=:V_TO)
filter("SHOP_NO"=:V_SHOP)