INSERT 문은 수행 방식에 따라 Redo와 Undo의 생성량이 달라질 수 있습니다.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
DROP TABLE t3 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(100));
CREATE TABLE t2 (c1 NUMBER, c2 VARCHAR2(100));
CREATE TABLE t3 (c1 NUMBER, c2 VARCHAR2(100));
아래와 같이 세 가지 방식으로 INSERT 문을 수행하겠습니다. 2-1번을 Single-row Insert, 2-2번을 Multi-row Insert, 3-3번을 Bulk Insert 방식이라고 부르겠습니다.
-- 2-1: Single-row Insert
BEGIN
FOR i IN 1 .. 1e6 LOOP
INSERT INTO t1 VALUES (i, LPAD ('X', 100, 'X'));
END LOOP;
COMMIT;
END;
/
-- 2-2: Multi-row Insert
INSERT INTO t3 SELECT ROWNUM, LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 1000000');
COMMIT;
-- 2-3: Bulk Insert
DECLARE
TYPE tnt IS TABLE OF PLS_INTEGER;
l_v1 tnt := tnt ();
BEGIN
FOR i IN 1 .. 1e6 LOOP
l_v1.EXTEND;
l_v1(i) := i;
END LOOP;
FORALL i IN l_v1.FIRST .. l_v1.LAST
INSERT INTO t2 VALUES (l_v1(i), LPAD ('X', 100, 'X'));
COMMIT;
END;
/
Single-row Insert 방식이 Multi-row Insert 방식과 Bulk Insert 방식보다 Redo와 Undo의 생성량이 많은 것을 확인할 수 있습니다. Multi-row Insert 방식과 Bulk Insert 방식은 Redo와 Undo의 생성량이 유사하며, Heap Segment Array Inserts 통계가 기록됩니다.
-- 3
+-------------------------------+----------+----------+----------+------+
|NAME | T1| T2| T3|CLASS |
+-------------------------------+----------+----------+----------+------+
|redo entries | 1.08M| 85.36K| 85.27K|Redo |
|redo size | 364.28M| 127.32M| 127.31M|Redo |
|HSC Heap Segment Block Changes | 1.00M| 28.69K| 28.69K|SQL |
|Heap Segment Array Inserts | 0.00 | 28.69K| 28.69K|SQL |
|undo change vector size | 63.92M| 3.83M| 3.84M|Debug |
+-------------------------------+----------+----------+----------+------+