테마
구 시스템에서 신 시스템으로 넘어가는 이관 리허설이 토요일에 있었다. 일곱 단계 중 「주문상세 단가 채우기」가 2.9초로 가장 길었다. 본 이관 날에는 단계마다 허용 시간이 정해져 있어서, 오과장이 이 단계를 먼저 봐 달라고 했다.
이관팀은 단가 규칙을 이관 공통 함수 FN_ITM_PRC에 넣어 두고 UPDATE 한 문장으로 채운다. 이관팀의 설명은 "한 문장이니 집합 처리다"라는 것이다.
T_ORD_DET 주문상세: 200,000행 · 896블록 · PK_T_ORD_DET (ORD_SEQ, ORD_DET_NO) · 이관 직후 UNT_PRC는 전부 NULL · 상품 100종M_ITM 상품: 100행 · 5블록 · PK_M_ITM (ITM_ID) · UNT_PRCM_ITM에 있다(이관 전 대조 완료) · 리허설 DB는 NOARCHIVELOG · 통계 최신CREATE OR REPLACE FUNCTION FN_ITM_PRC(p_itm_id M_ITM.ITM_ID%TYPE) RETURN NUMBER IS
v_prc M_ITM.UNT_PRC%TYPE;
BEGIN
SELECT UNT_PRC INTO v_prc FROM M_ITM WHERE ITM_ID = p_itm_id;
RETURN v_prc;
END;
/
UPDATE T_ORD_DET d
SET d.UNT_PRC = FN_ITM_PRC(d.ITM_ID);
COMMIT;
[DISPLAY_CURSOR (ALLSTATS LAST)]
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | | 0 |00:00:02.91 | 206K |
| 1 | UPDATE | T_ORD_DET | 1 | | 0 |00:00:02.91 | 206K |
| 2 | TABLE ACCESS FULL| T_ORD_DET | 1 | 200K | 200K |00:00:00.04 | 896 |
-----------------------------------------------------------------------------------------
[세션 통계: UPDATE 한 번]
경과 시간 2.91 초 (CPU 2.62 초)
recursive calls 200,014
execute count 200,005
consistent gets 401,216
db block gets 204,977
redo size 47.6 MB
[V$SQL: 함수 안의 문장 (dep=1)]
SELECT UNT_PRC FROM M_ITM WHERE ITM_ID = :B1 EXECUTIONS 200,000 · BUFFER_GETS 400,000