테마
야간 정산 배치의 적재 단계에서는 주문 10만 건을 정산 테이블로 옮긴다. 배치 담당 오과장: "04시 마감인데 다른 단계와 겹치면 넘긴다."
소스의 커밋 줄 옆에는 -- 트랜잭션은 짧게 (2020.07 강도현)라는 주석이 있다. 그해 7월 언두 공간 부족 장애 뒤에 넣은 줄이다.
T_ORD(원천): 100,000행 · 896블록T_ORD_STLM(대상): 배치를 시작할 때마다 비운다(TRUNCATE). 인덱스는 없고, 다른 세션은 배치가 끝난 뒤에 읽는다.PROCEDURE P1_LOAD(p_limit NUMBER DEFAULT 100000) IS
n NUMBER := 0;
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE T_ORD_STLM';
FOR r IN (SELECT ORD_SEQ, CUS_ID, ORD_DT, ORD_AMT
FROM T_ORD
WHERE ROWNUM <= p_limit) LOOP
n := n + 1;
INSERT INTO T_ORD_STLM (STLM_SEQ, ORD_SEQ, CUS_ID, STLM_DT, STLM_AMT)
VALUES (n, r.ORD_SEQ, r.CUS_ID, r.ORD_DT, r.ORD_AMT);
IF MOD(n, 1000) = 0 THEN COMMIT; END IF; -- 트랜잭션은 짧게 (2020.07 강도현)
END LOOP;
COMMIT;
END;
[세션 통계 — P1_LOAD(100000) 한 번]
경과 시간 850 ~ 1,010 ms
CPU used by this session 430 ~ 470 ms
session logical reads 110,130 ~ 110,420
redo size 28.6 MB
undo change vector size 6.5 MB
user commits 101
INSERT 실행 횟수 100,000
[TKPROF 모양 — 루프 안의 INSERT]
INSERT INTO T_ORD_STLM (STLM_SEQ, ORD_SEQ, CUS_ID, STLM_DT, STLM_AMT) VALUES (:B5, :B4, :B3, :B2, :B1)
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Execute 100000 (CPU 의 대부분) 0 (적음) (대부분) 100000