Skip to content
튜닝 연습파티션
PART-015

포인트 소멸 안내 배치의 실행계획에 Pstop 1048575가 찍힌다

기초INSERT이커머스390 / 700

이 문제는 교재 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)뿐이다. 통계는 최신이다.

원본 SQL ​

sql
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

실행계획 학습용 예시 ​

xplan
-------------------------------------------------------------------------------------------------------------------------------
| 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))

문제 ​

  1. Pstop의 1048575가 무엇을 뜻하는지 쓰고, 이 배치가 칸을 전부 여는 까닭을 설명하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 적립일 하루가 든 칸만 읽게 하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자