테마
가맹점주 앱의 「주간 주문 추이」는 매장 한 곳의 일주일치 일별 주문 수와 전일 대비 증감을 보여 준다. 점주 200명이 아침마다 열어서 출근 시간에 0.3초짜리 호출이 몰린다.
화면 SQL은 공통 뷰 V_SHOP_DAY에 매장과 기간 조건을 건다. 조민우는 "매장 조건은 뷰 안으로 들어가는데 날짜 조건은 왜 안 들어가는지 모르겠다. 날짜 조건을 뷰 안에 직접 넣어 보니 빨라지긴 했는데 첫날 증감이 비어 나온다"라고 한다.
ORD 주문: 1,000,000행 · 22,422블록 · ORD_DT VARCHAR2(8) · 2012 ~ 2013년 730일 · 날짜순 적재 · 하루치 약 1,370건이 31블록에 모여 있다ORD_X01 (ORD_DT, ORD_HMS) · 하루치 리프 약 5블록 · SHOP_NO에는 인덱스가 없다:shop = 'SH0042', :d1 = '20130311', :d2 = '20130317'-- 공통 뷰: 매장 일별 주문 수와 전일 주문 수
CREATE OR REPLACE VIEW V_SHOP_DAY AS
SELECT SHOP_NO, ORD_DT, COUNT(*) AS ORD_CNT,
LAG(COUNT(*)) OVER (PARTITION BY SHOP_NO ORDER BY ORD_DT) AS PREV_CNT
FROM ORD
GROUP BY SHOP_NO, ORD_DT;
-- 주간 주문 추이
SELECT ORD_DT, ORD_CNT, ORD_CNT - PREV_CNT AS DIFF
FROM V_SHOP_DAY
WHERE SHOP_NO = :shop
AND ORD_DT BETWEEN :d1 AND :d2
ORDER BY ORD_DT;
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 7 |00:00:00.28 | 22422 | |
| 1 | SORT ORDER BY | | 1 | 7 | 7 |00:00:00.28 | 22422 | 2048 (0)|
|* 2 | VIEW | V_SHOP_DAY | 1 | 730 | 7 |00:00:00.28 | 22422 | |
| 3 | WINDOW BUFFER | | 1 | 730 | 730 |00:00:00.28 | 22422 |36864 (0)|
| 4 | SORT GROUP BY | | 1 | 730 | 730 |00:00:00.28 | 22422 |49152 (0)|
|* 5 | TABLE ACCESS FULL | ORD | 1 | 5000 | 5003 |00:00:00.27 | 22422 | |
--------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(("ORD_DT">=:D1 AND "ORD_DT"<=:D2))
5 - filter("SHOP_NO"=:SHOP)