테마
버거 본사는 7월에 POS 원장을 월별 파티션 테이블 ORD_RANGE로 옮겼다. 빈 테이블로 만들고 칸마다 원장을 날짜순으로 옮겨 실은 뒤, 업체 가이드("파티션 테이블은 바뀐 칸만 모은다")대로 칸 단위로만 통계를 모았다. 지금도 야간 통계 잡은 적재가 있었던 이번 달 칸만 granularity => 'PARTITION'으로 모은다.
마케팅팀의 「버거 데이 매출 비교」(매달 둘째 화요일, 5월부터 8번)가 22,000블록 넘게 읽는다. 오과장은 이렇게 말한다. "테이블 전체를 다시 모으면 밤마다 24칸을 다 읽어요. 칸이 늘수록 더 길어지고요." 박팀장: "어느 방식으로 갈지 근거를 붙여서."
ORD_RANGE: ORD와 같은 열 + ORD_YM VARCHAR2(6)(파티션 키) · 1,000,000행 · 월별 24칸(P201201 ~ P201312) · 칸마다 약 41,700행, 약 935블록, 합계 약 22,440블록 · 날짜순으로 실었다ORD_RANGE_X01 (ORD_DT, ORD_HMS) LOCAL · 칸마다 높이 2ORD_DT NDV 28 ~ 31). 전역 통계는 한 번도 따로 모으지 않았다: GLOBAL_STATS NO(칸 통계를 합친 값) · NUM_ROWS 1,000,000 · ORD_DT NUM_DISTINCT 31(실제 730)INCREMENTAL FALSE) · 통계 이력 31일-- 야간 통계 잡 (업체 가이드 · 적재가 있었던 이번 달 칸만)
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'DEV',
tabname => 'ORD_RANGE',
partname => 'P' || TO_CHAR(SYSDATE, 'YYYYMM'),
granularity => 'PARTITION');
END;
/
-- 마케팅 「버거 데이 매출 비교」 (매달 둘째 화요일)
SELECT ORD_DT, SHOP_NO, COUNT(*) AS ord_cnt
FROM ORD_RANGE
WHERE ORD_DT IN ('20130514', '20130611', '20130709', '20130813',
'20130910', '20131008', '20131112', '20131210')
GROUP BY ORD_DT, SHOP_NO
[버거 데이 매출 비교]
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1600 |00:00:00.31 | 22440 | | |
| 1 | HASH GROUP BY | | 1 | 6200 | 1600 |00:00:00.31 | 22440 | | |
| 2 | PARTITION RANGE ALL| | 1 | 258K| 10960 |00:00:00.30 | 22440 | 1 | 24 |
|* 3 | TABLE ACCESS FULL | ORD_RANGE | 24 | 258K| 10960 |00:00:00.29 | 22440 | 1 | 24 |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter(("ORD_DT"='20130514' OR "ORD_DT"='20130611' OR "ORD_DT"='20130709' OR
"ORD_DT"='20130813' OR "ORD_DT"='20130910' OR "ORD_DT"='20131008' OR
"ORD_DT"='20131112' OR "ORD_DT"='20131210'))
[USER_TAB_STATISTICS · USER_TAB_COL_STATISTICS — ORD_RANGE]
수준 GLOBAL_STATS NUM_ROWS ORD_DT NUM_DISTINCT
전역 NO 1,000,000 31 (칸 통계를 합친 값)
P201306 YES 41,096 30
P201312 YES 42,467 31
[야간 통계 잡 — 방식별 (복사본 · 학습용 예시)]
방식 읽는 블록 걸린 시간 전역 ORD_DT NDV
이번 달 칸만 (granularity PARTITION · 지금) 약 935 0.4초 31
테이블 전체 (granularity AUTO) 약 22,440 6.1초 730
INCREMENTAL TRUE · 첫 수집 약 22,440 7.3초 730 (칸마다 시놉시스를 남긴다)
INCREMENTAL TRUE · 다음 날부터 (바뀐 칸 하나) 약 935 0.6초 730 (시놉시스를 합친다)
ORD_YM을 더하면 고쳐지는지도 쓰시오.