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

새 달 칸을 만들지 않아 기본 칸에 1월과 2월 주문이 섞여 쌓였다

실전DDL버거402 / 700

상황 ​

버거 ORD_RANGE는 달마다 칸을 손으로 만든다. 12월 말 담당자가 바뀌면서 2014년 칸을 만드는 일이 빠졌고, 1월 1일부터 들어온 주문이 모두 P_DEFAULT (MAXVALUE)에 쌓였다. 2월 6일 오과장이 알아채고 아래 두 문장을 준비했다. 시험 DB에서 먼저 돌려 본 결과가 아래에 있다. POS는 24시간 주문을 넣고, 영수증 재조회는 하루 약 6만 번 호출된다. 오과장: "칸을 떼어 내고, 이참에 INTERVAL로 바꿔서 다시는 손으로 만들지 않게 하겠다."

테이블과 인덱스 ​

  • ORD_RANGE 주문(파티션 복사본, 교재 14화): PARTITION BY RANGE (ORD_YM). P201202 ~ P201312 23칸(1월 1일에 P201201을 들어냈다)과 P_DEFAULT (MAXVALUE). 칸 하나 FULL ≈ 1,980블록이다.
  • P_DEFAULT에는 2014년 1월 42,117행과 2월 1 ~ 5일 6,593행, 모두 48,710행이 있다.
  • ORD_YM은 VARCHAR2(6)이고 적재할 때 SUBSTR(ORD_DT, 1, 6)으로 채운다.
  • LOCAL 인덱스 ORD_RANGE_PK (ORD_NO, ORD_YM) · ORD_RANGE_X01 (ORD_DT, ORD_HMS). GLOBAL 유니크 인덱스 ORD_RANGE_GX01 (ORD_NO): 영수증 재조회용(4블록)
  • 운영은 ARCHIVELOG다. 다른 테이블이 FK로 참조하지 않는다. 월 정리는 매월 1일 03:00에 돈다.

원본 SQL ​

sql
-- (1) 1월 칸을 떼어 낸다
ALTER TABLE ORD_RANGE SPLIT PARTITION P_DEFAULT AT ('201402')
  INTO (PARTITION P201401, PARTITION P_DEFAULT);

-- (2) 앞으로는 칸을 손으로 만들지 않게 INTERVAL 로 바꾼다
ALTER TABLE ORD_RANGE SET INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'));

실행계획 학습용 예시 · 경과 시간과 redo는 어림값 ​

xplan
[시험 DB · (1) SPLIT · 경과 1.4초 · redo 약 11MB]
  P201401                          42,117행 (새 세그먼트)
  P_DEFAULT                         6,593행 (새 세그먼트)
  ORD_RANGE_PK · ORD_RANGE_X01      P201401 · P_DEFAULT 칸 UNUSABLE (다른 23칸은 USABLE)
  ORD_RANGE_GX01                    UNUSABLE

[그 직후 · POS 주문 INSERT]
  ORA-01502: index 'DEV.ORD_RANGE_GX01' or partition of such index is in unusable state

[그 직후 · 영수증 재조회 (WHERE ORD_NO = :ord_no)]
  ORD_RANGE_GX01 을 쓰지 못한다 · 깨진 두 칸은 FULL 로 읽는다 · 4 → 약 1,300블록 (에러 없음)

[시험 DB · (2) SET INTERVAL]
  ORA-14751: invalid data type for partitioning column of an interval partitioned table

문제 ​

  1. 오과장의 두 문장을 시험 DB에서 돌린 결과를 보고, 각각 무엇이 문제인지 인덱스 상태와 영수증 재조회, 주문 적재에 미치는 영향으로 설명하시오.
  2. 지금 P_DEFAULT에 섞여 쌓인 1월과 2월 주문을 나누는 SQL을 작성하고, UPDATE INDEXES를 붙이는 안과 나중에 REBUILD하는 안을 비교하시오.
  3. 같은 일이 다시 생기지 않게 할 방법을 쓰고, INTERVAL 파티션을 쓰려면 무엇을 바꿔야 하는지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자