테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
이커머스의 적립 포인트는 적립일로부터 365일이 지나면 소멸한다. 「소멸 예정 안내」 배치는 매일 새벽 7일 뒤에 소멸될 적립 건을 골라 안내 대상 테이블에 넣는다. 포인트 거래가 빠르게 늘 것으로 보고 지난달 월별 INTERVAL 파티션 복사본으로 옮겼다.
배치 기준일은 DATE 바인드 :v_base(그날 0시)로 넘긴다. 아래는 :v_base = 2024-12-01의 실행이다.
point_transactions_p 포인트 거래(파티션 복사본, 문제 설정): point_transactions 45,000행을 PARTITION BY RANGE (created_at) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))로 나눠 CTAS로 지었다(STORAGE (INITIAL 64K)). 2020년 1월 ~ 2024년 12월의 60칸이 있고, 칸 하나는 약 750행이며 FULL로 약 4 ~ 5블록, 60칸 전체는 약 270블록이다.created_at은 DATE이고 시분초가 있다. tx_type은 EARN, USE, EXPIRE 세 가지이고, 하루 적립(EARN)은 약 15건이다.point_expire_notice 안내 대상(문제 설정): 배치가 매일 비우고 다시 넣는다. 인덱스는 없다.point_transactions_p의 인덱스는 PK(tx_id)뿐이다. 통계는 최신이다.INSERT INTO point_expire_notice (customer_id, tx_id, amount, expire_dt)
SELECT customer_id, tx_id, amount, :v_base + 7
FROM point_transactions_p
WHERE tx_type = 'EARN'
AND TRUNC(created_at) + 365 = :v_base + 7
-------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Pstart | Pstop |
-------------------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | | 0 | 00:00:00.01 | 284 | | |
| 1 | LOAD TABLE CONVENTIONAL | POINT_EXPIRE_NOTICE | 1 | | 0 | 00:00:00.01 | 284 | | |
| 2 | PARTITION RANGE ALL | | 1 | 150 | 16 | 00:00:00.01 | 270 | 1 | 1048575 |
|* 3 | TABLE ACCESS FULL | POINT_TRANSACTIONS_P | 60 | 150 | 16 | 00:00:00.01 | 270 | 1 | 1048575 |
-------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter(("TX_TYPE"='EARN' AND TRUNC(INTERNAL_FUNCTION("CREATED_AT"))+365=:V_BASE+7))