테마
야간 체인 ① 재적재는 14화 이후 TRUNCATE → 인덱스 UNUSABLE → APPEND → REBUILD 순서로 돈다. 월요일 09:20, 조민우: "정산 기간 조회가 오늘 아침부터 느려요. 0.02초 걸리던 게 0.3초예요." 같은 시간 DB 서버 CPU는 평소의 두 배였다. 이 조회는 정산 화면에서 시간당 약 1,800번 호출된다.
체인 로그를 보니 REBUILD 단계 하나에 경고가 남아 있었다. 체인은 단계가 실패해도 경고로 적고 다음 단계로 넘어가게 되어 있다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · 2024년 6월 27,390행 · 낮에는 읽기만 한다.IX_ORD_BIG_DT_AMT (ORD_DT, ORD_AMT)(Q1 정산 기간 조회, 리프 3,206블록) · IX_ORD_BIG_DT_SEQ (ORD_DT, ORD_SEQ)(Q4 정산 목록 페이징, 리프 3,344블록)skip_unusable_indexes는 기본값 TRUE다.-- 일요일 22:00 · 체인 ① (단계마다 따로 돈다 · 실패하면 경고를 적고 다음 단계로)
-- [1-1]
TRUNCATE TABLE T_ORD_BIG;
-- [1-2]
ALTER INDEX IX_ORD_BIG_DT_AMT UNUSABLE;
ALTER INDEX IX_ORD_BIG_DT_SEQ UNUSABLE;
-- [1-3]
INSERT /*+ APPEND */ INTO T_ORD_BIG (ORD_SEQ, CUS_ID, ORD_DT, ORD_ST, ORD_AMT)
SELECT ORD_SEQ, CUS_ID, ORD_DT, ORD_ST, ORD_AMT FROM STG_ORD_BIG;
COMMIT;
-- [1-4]
ALTER INDEX IX_ORD_BIG_DT_AMT REBUILD;
-- [1-5]
ALTER INDEX IX_ORD_BIG_DT_SEQ REBUILD;
-- [1-6]
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_ORD_BIG')
[체인 로그 — 일요일]
22:00:04 [1-1] TRUNCATE 완료
22:00:04 [1-2] UNUSABLE × 2 완료
22:00:05 [1-3] INSERT APPEND 1,000,000행 완료
22:00:05 [1-4] REBUILD IX_ORD_BIG_DT_AMT 경고 ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
22:00:07 [1-5] REBUILD IX_ORD_BIG_DT_SEQ 완료
22:00:08 [1-6] 통계 수집 완료
… 체인 종료 03:41 · 상태 「경고 1」
[월요일 09:25 · USER_INDEXES]
INDEX_NAME STATUS LEAF_BLOCKS
IX_ORD_BIG_DT_AMT UNUSABLE
IX_ORD_BIG_DT_SEQ VALID 3344
[월요일 09:25 · Q1 정산 기간 조회]
SELECT SUM(ORD_AMT) FROM T_ORD_BIG WHERE ORD_DT >= :B1 AND ORD_DT < :B2 -- 2024-06-01 ~ 2024-07-01
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.29 | 5822 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.29 | 5822 |
|* 2 | TABLE ACCESS FULL| T_ORD_BIG | 1 | 27390 | 27390 |00:00:00.28 | 5822 |
-------------------------------------------------------------------------------------------
2 - filter(("ORD_DT">=:B1 AND "ORD_DT"<:B2))
(지난 금요일 같은 SQL: INDEX RANGE SCAN IX_ORD_BIG_DT_AMT · Buffers 91)