테마
유통 본사는 매장 포털을 위해 판매를 "매장별, 월별 칸"으로 나눈 복사본 CF10_SR을 만들었다. 매장 포털의 「매장 월 판매」(하루 수천 번)는 칸 하나만 읽어 빨라졌다.
그런데 본사 영업관리팀의 「월 판매 집계」(전 매장, 월초 하루 수십 번)는 월별로만 나눈 예전 CF10_P보다 오히려 느리다.
CF10_SR 판매(파티션 복사본, 문제 설정): CF10 500,000행을 두 컬럼 범위 키 PARTITION BY RANGE (SHP_NO, SLE_DT)로 나눠 CTAS로 지었다(STORAGE (INITIAL 64K)). 매장마다 월별 24칸(P1001_202201 ~ P1001_202312 …)과 매장별 MAXVALUE 칸이 있고 맨 끝에 PMAX가 있어 모두 126칸이다. 데이터가 있는 칸은 120개이고, 칸 하나는 약 4,170행, FULL로 약 39블록이다.SHP_NO 1001 ~ 1005, NUMBER)이다. SLE_DT는 VARCHAR2(8)이다. 2023년 6월 전 매장 판매는 20,953건이다.CF10_P(월별 24칸): 칸 하나 FULL ≈ 191블록이다.CF10_SR_PK (SLE_NO) GLOBAL뿐이다. 통계는 최신이다.CREATE TABLE CF10_SR
STORAGE (INITIAL 64K)
PARTITION BY RANGE (SHP_NO, SLE_DT)
( PARTITION P1001_202201 VALUES LESS THAN (1001, '20220201'),
-- … 1001번 매장의 달마다 한 줄
PARTITION P1001_202312 VALUES LESS THAN (1001, '20240101'),
PARTITION P1001_MAX VALUES LESS THAN (1001, MAXVALUE),
PARTITION P1002_202201 VALUES LESS THAN (1002, '20220201'),
-- … 1005번 매장까지 같은 모양
PARTITION PMAX VALUES LESS THAN (MAXVALUE, MAXVALUE) )
AS SELECT * FROM CF10;
-- Q1 매장 포털 「매장 월 판매」 (하루 수천 번)
SELECT SLE_DT, COUNT(*) AS sle_cnt
FROM CF10_SR
WHERE SHP_NO = :v_shp
AND SLE_DT BETWEEN :v_from AND :v_to
GROUP BY SLE_DT;
-- Q2 본사 「월 판매 집계」 (월초 하루 수십 번)
SELECT SHP_NO, COUNT(*) AS sle_cnt, COUNT(DISTINCT SLE_DT) AS sle_days
FROM CF10_SR
WHERE SLE_DT BETWEEN :v_from AND :v_to
GROUP BY SHP_NO;
-- Q3 본사 「매장 연간 추이」 (분기마다 몇 번) : SHP_NO = :v_shp AND SLE_DT 한 해
[Q1 · 1003번 매장 · 2023년 6월]
-------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Pstart | Pstop |
-------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 30 | 00:00:00.01 | 39 | | |
| 1 | HASH GROUP BY | | 1 | 30 | 30 | 00:00:00.01 | 39 | | |
|* 2 | FILTER | | 1 | | 4188 | 00:00:00.01 | 39 | | |
| 3 | PARTITION RANGE ITERATOR | | 1 | 4170 | 4188 | 00:00:00.01 | 39 | KEY | KEY |
|* 4 | TABLE ACCESS FULL | CF10_SR | 1 | 4170 | 4188 | 00:00:00.01 | 39 | KEY | KEY |
-------------------------------------------------------------------------------------------------------------------
2 - filter(:V_FROM<=:V_TO)
4 - filter(("SHP_NO"=:V_SHP AND "SLE_DT">=:V_FROM AND "SLE_DT"<=:V_TO))
(실행 때 고른 칸 — 1003번 매장의 2023년 6월 칸 하나)
[Q2 · 2023년 6월 · 전 매장]
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Pstart | Pstop |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 5 | 00:00:00.09 | 4690 | | |
| 1 | SORT GROUP BY | | 1 | 5 | 5 | 00:00:00.09 | 4690 | | |
|* 2 | FILTER | | 1 | | 20953 | 00:00:00.08 | 4690 | | |
| 3 | PARTITION RANGE ALL | | 1 | 20800 | 20953 | 00:00:00.08 | 4690 | 1 | 126 |
|* 4 | TABLE ACCESS FULL | CF10_SR | 120 | 20800 | 20953 | 00:00:00.07 | 4690 | 1 | 126 |
--------------------------------------------------------------------------------------------------------------
2 - filter(:V_FROM<=:V_TO)
4 - filter(("SLE_DT">=:V_FROM AND "SLE_DT"<=:V_TO))
[Q3 · 1003번 매장 · 2023년] PARTITION RANGE ITERATOR · KEY / KEY · Starts 12 · Buffers 468