Oracle Database는 MERGE 문의 개별 Insert, Update 로우 수를 제공하지 않습니다. 패키지 변수로 MERGE 문의 개별 Insert, Update 로우 수를 계산할 수 있지만 성능 저하가 발생할 수 있습니다.
아래 세션 통계를 사용하면 성능 저하없이 MERGE 문의 개별 Insert, Update 로우 수를 계산할 수 있습니다. 참고로 MERGE 문의 Update과 Delete는 Row 단위, Insert는 Array 단위로 처리됩니다.
통계 | 내용 |
HSC Heap Segment Block Changes | 힙 세그먼트의 블록을 변경하기 위해 액세스한 로우 수 (Array 처리는 1 증가) |
Heap Segment Array Inserts | 힙 세그먼트에 대한 Array Insert 횟수 |
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, 1 FROM XMLTABLE ('1 to 200');
CREATE TABLE t2 (c1, c2) AS SELECT ROWNUM, CEIL (ROWNUM / 100) FROM XMLTABLE ('1 to 500');
아래와 같이 ROWCOUNT 속성 값과 HSC Heap Segment Block Changes, Heap Segment Array Inserts 통계 값으로 MERGE 문의 개별 Insert, Update 로우 수를 계산할 수 있습니다.
-- 2
SET SERVEROUT ON
DECLARE
v_rows NUMBER;
v_hsbc NUMBER;
v_hsai NUMBER;
FUNCTION f1 (i_name IN VARCHAR2)
RETURN NUMBER
IS
v_value NUMBER;
BEGIN
SELECT b.value
INTO v_value
FROM v$statname a
, v$mystat b
WHERE a.name = i_name
AND b.statistic# = a.statistic#;
RETURN v_value;
END;
BEGIN
v_hsbc := f1 ('HSC Heap Segment Block Changes');
v_hsai := f1 ('Heap Segment Array Inserts');
MERGE
INTO t1 t
USING t2 s
ON (t.c1 = s.c1)
WHEN MATCHED THEN
UPDATE SET t.c2 = s.c2
-- DELETE WHERE t.c2 = 1
WHEN NOT MATCHED THEN
INSERT (t.c1, t.c2) VALUES (s.c1, s.c1);
v_rows := SQL%ROWCOUNT;
v_hsbc := f1 ('HSC Heap Segment Block Changes') - v_hsbc;
v_hsai := f1 ('Heap Segment Array Inserts') - v_hsai;
DBMS_OUTPUT.PUT_LINE ('v_rows = ' || v_rows);
DBMS_OUTPUT.PUT_LINE ('v_hsbc = ' || v_hsbc);
DBMS_OUTPUT.PUT_LINE ('v_hsai = ' || v_hsai);
DBMS_OUTPUT.PUT_LINE ('MERGE = ' || (v_rows));
DBMS_OUTPUT.PUT_LINE ('INSERT = ' || (v_rows - (v_hsbc - v_hsai)));
DBMS_OUTPUT.PUT_LINE ('UPDATE = ' || (v_hsbc - v_hsai));
ROLLBACK;
END;
/
v_rows = 500
v_hsbc = 202
v_hsai = 2
MERGE = 500
INSERT = 300
UPDATE = 200
PL/SQL 처리가 정상적으로 완료되었습니다.
참고로 DELETE 절의 주석을 제거하고 앞선 코드를 다시 수행하면 HSC Heap Segment Block Changes 통계 값에 Delete 대상 로우 수가 더해져 Insert, Update의 로우 수가 잘못 계산됩니다.
-- 3
/
v_rows = 500
v_hsbc = 402
v_hsai = 2
MERGE = 500
INSERT = 100
UPDATE = 400
PL/SQL 처리가 정상적으로 완료되었습니다.
참고 링크