테마
유통 본사의 「당월 재적재」 배치는 매일 02:00에 돈다. 매장 POS의 정정분(반품 취소, 시각 보정)을 반영하려고 이번 달 칸을 비우고 스테이징 테이블에서 다시 넣는다. 지난주까지 잘 돌던 배치가 오늘 새벽 INSERT에서 멈췄고, 아침 9시부터 매장에서 「반품 영수증 조회」가 느리다는 전화가 왔다. 배치 담당 오과장: "어제 DBA가 영수증 조회 때문에 PK를 바꿨다고 했다."
CF10_P 판매(파티션 복사본, 문제 설정): CF10 500,000행을 PARTITION BY RANGE (SLE_DT) 월별 24칸(P202201 ~ P202312)과 빈 PMAX로 나눠 CTAS로 지었다. 칸 하나는 약 20,800행이고 FULL로 약 191블록이다. 오늘은 2023년 12월 14일이고, P202312(24번째 칸)에는 13일 치 약 9,100행이 있었다.CF10_P_PK (SLE_NO) GLOBAL 유니크 인덱스(파티션하지 않은 인덱스)로 바꿨다. 판매번호만으로 한 번에 찾게 하려는 것이었다(높이 3, 조회 4블록).CF10_P_X01 (SHP_NO, SLE_DT): 매장 일 매출 화면용CF10_STG 판매 스테이징: POS가 보낸 이번 달 판매 전체(정정 반영)CF10_P를 FK로 참조하지 않는다. SKIP_UNUSABLE_INDEXES는 기본값(TRUE)이다.-- 당월 재적재 (매일 02:00)
ALTER TABLE CF10_P TRUNCATE PARTITION P202312;
INSERT INTO CF10_P (SLE_NO, SLE_DT, SLE_HMS, SLE_DOW, SHP_NO)
SELECT SLE_NO, SLE_DT, SLE_HMS, SLE_DOW, SHP_NO
FROM CF10_STG
WHERE SLE_DT BETWEEN '20231201' AND '20231231';
COMMIT;
[배치 로그 · 2023-12-14]
02:00:01 ALTER TABLE CF10_P TRUNCATE PARTITION P202312 완료 (0.2초)
02:00:02 INSERT INTO CF10_P ... SELECT ... FROM CF10_STG
ORA-01502: index 'PUP.CF10_P_PK' or partition of such index is in unusable state
[인덱스 상태 · 09:10]
USER_INDEXES CF10_P_PK PARTITIONED NO STATUS UNUSABLE
USER_IND_PARTITIONS CF10_P_X01 24칸 모두 USABLE (P202312 칸은 비어 있다)
[반품 영수증 조회 · 09:12 · :sle_no = '20231107-0215']
-----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Pstart | Pstop |
-----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 | 00:00:00.03 | 4396 | | |
| 1 | PARTITION RANGE ALL | | 1 | 1 | 1 | 00:00:00.03 | 4396 | 1 | 25 |
|* 2 | TABLE ACCESS FULL | CF10_P | 24 | 1 | 1 | 00:00:00.03 | 4396 | 1 | 25 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("SLE_NO"=:SLE_NO)