테마
정산 화면이 등급별로 묶어 보려고 T_ORD_STLM에 고객 등급 칸(CUS_GD)을 더했고, 야간 체인에 그 칸을 채우는 단계가 하나 생겼다. 체인 시각을 찍어 보니 이 단계가 1.3초로, 정산 10만 건을 넣는 적재 단계(0.1초)보다 오래 걸린다.
배치 담당 오과장: "한 건씩 ROWID로 바로 찾아가니까 제일 빠른 방법 아닌가요?"
T_ORD_STLM: 100,000행 · 640블록. 이 문제에서는 CUS_GD VARCHAR2(1) 칸이 더 있다. 체인 첫 단계(P1)가 매일 밤 비우고 다시 채우므로, 이 단계가 돌 때 CUS_GD는 전부 NULL이다. 인덱스는 없다.M_CUS: 2,000행 · 30블록 · PK_M_CUS (CUS_ID) · 정산의 CUS_ID는 모두 M_CUS에 있다.INSERT /*+ APPEND */ … SELECT ROWNUM, … FROM T_ORD 한 문장이다(교재 14화 rev02).-- 야간 체인 ② 정산 등급 채우기
BEGIN
FOR r IN (SELECT s.ROWID AS rid, c.CUS_GD
FROM T_ORD_STLM s, M_CUS c
WHERE c.CUS_ID = s.CUS_ID) LOOP
UPDATE T_ORD_STLM
SET CUS_GD = r.CUS_GD
WHERE ROWID = r.rid;
END LOOP;
COMMIT;
END;
[세션 통계 — ② 한 번]
경과 시간 1.28 ~ 1.36 초
CPU used by this session 1.15 초
recursive calls 101,046
execute count 100,021
session logical reads 약 203,600
redo size 약 24.8 MB
undo change vector size 약 7.9 MB
[TKPROF 모양 — ② 의 두 문장]
SELECT S.ROWID AS RID, C.CUS_GD FROM T_ORD_STLM S, M_CUS C WHERE C.CUS_ID = S.CUS_ID
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Fetch 1001 0.06 0.07 0 1670 0 100000 (HASH JOIN · M_CUS 30 + T_ORD_STLM 640)
UPDATE T_ORD_STLM SET CUS_GD = :B2 WHERE ROWID = :B1
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Execute 100000 0.93 1.02 0 100000 102861 100000 (TABLE ACCESS BY USER ROWID)