테마
본사 영업기획팀의 「분기 매장 실적」은 연도와 분기를 고르면 매장별 주문 건수를 낸다. 분기 회의 전 주에 수십 번 돌린다. "파티션을 했다는데 왜 이렇게 오래 걸리나."
화면은 :v_yyyy = '2012'와 :v_q = '3'을 넘긴다.
ORD_RANGE 주문(파티션 복사본): 1,000,000행 · PARTITION BY RANGE (ORD_YM) 월별 25칸. P201201 ~ P201312 24칸에 P_DEFAULT (MAXVALUE) 1칸이 더 있다(비어 있고 세그먼트가 없다).ORD_YM은 VARCHAR2(6) '201207' 형식의 파티션 키이고, 적재할 때 SUBSTR(ORD_DT,1,6)으로 채웠다. 칸 하나를 FULL로 읽으면 약 1,980블록이다(데이터 약 970블록, 적재 때 생긴 빈 블록 약 1,006블록, 교재 14화 §8.5).ORD_RANGE_PK (ORD_NO, ORD_YM)와 ORD_RANGE_X01 (ORD_DT, ORD_HMS)가 있지만 이 조회에는 쓰이지 않는다(통계 100%).SELECT SHOP_NO, COUNT(*) AS ord_cnt
FROM ORD_RANGE
WHERE SUBSTR(ORD_YM, 1, 4) = :v_yyyy
AND TO_CHAR(TO_DATE(ORD_YM, 'YYYYMM'), 'Q') = :v_q
GROUP BY SHOP_NO
ORDER BY SHOP_NO
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Pstart | Pstop |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 200 | 00:00:00.46 | 47460 | | |
| 1 | SORT GROUP BY | | 1 | 100 | 200 | 00:00:00.46 | 47460 | | |
| 2 | PARTITION RANGE ALL | | 1 | 100 | 126K | 00:00:00.43 | 47460 | 1 | 25 |
|* 3 | TABLE ACCESS FULL | ORD_RANGE | 24 | 100 | 126K | 00:00:00.42 | 47460 | 1 | 25 |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter((SUBSTR("ORD_YM",1,4)=:V_YYYY AND
TO_CHAR(TO_DATE("ORD_YM",'YYYYMM'),'Q')=:V_Q))