概要
通常、データ更新(INSERT/UPDATE/DELETE)でREDOログが出力されますが、更新を伴わないselect ~ for update文でもREDO生成がされます。
※for updateを伴わないselect文(参照のみ)ではREDOは生成されません。
また、SELECT FOR UPDATE文の対象となる行数の累計が多いほど大量になります。
これは、SELECT FOR UPDATE文が実行時にSELECT対象行に対して、下記の情報をREDO LOGに書き込むためです。
* 行に対して明示的にロックを獲得する処理
* 上記処理のロールバックのためのUNDO情報をロールバックセグメントに記録する処理
上記の動作は仕様動作となります。
SELECT FOR UPDATEの対象となる行数と回数が多いほどREDOログ生成量が増加することになります。
動作確認
- SELECT文(for updateなし)
SQL> select m.sid,m.statistic#,s.name,m.value,m.con_id from v$mystat m, v$statname s where m.statistic#=s.statistic# and m.con_id = s.con_id and s.name = 'redo size'; SID STATISTIC# NAME VALUE CON_ID ---------- ---------- -------------------- ---------- ---------- 1837 313 redo size 768 3 SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 1980/12/17 00:00:00 800 20 7499 ALLEN SALESMAN 7698 1981/02/20 00:00:00 1600 300 30 : <中略> : 7902 FORD ANALYST 7566 1981/12/03 00:00:00 3000 20 7934 MILLER CLERK 7782 1982/01/23 00:00:00 1300 10 14 rows selected. SQL> select m.sid,m.statistic#,s.name,m.value,m.con_id from v$mystat m, v$statname s where m.statistic#=s.statistic# and m.con_id = s.con_id and s.name = 'redo size'; SID STATISTIC# NAME VALUE CON_ID ---------- ---------- -------------------- ---------- ---------- 1837 313 redo size 768 3
- SELECT ~ FOR UPDATE文
SQL> select m.sid,m.statistic#,s.name,m.value,m.con_id from v$mystat m, v$statname s where m.statistic#=s.statistic# and m.con_id = s.con_id and s.name = 'redo size'; SID STATISTIC# NAME VALUE CON_ID ---------- ---------- -------------------- ---------- ---------- 1377 313 redo size 768 3 SQL> select * from emp for update; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 1980/12/17 00:00:00 800 20 7499 ALLEN SALESMAN 7698 1981/02/20 00:00:00 1600 300 30 : <中略> : 7902 FORD ANALYST 7566 1981/12/03 00:00:00 3000 20 7934 MILLER CLERK 7782 1982/01/23 00:00:00 1300 10 14 rows selected. SQL> select m.sid,m.statistic#,s.name,m.value,m.con_id from v$mystat m, v$statname s where m.statistic#=s.statistic# and m.con_id = s.con_id and s.name = 'redo size'; SID STATISTIC# NAME VALUE CON_ID ---------- ---------- -------------------- ---------- ---------- 1377 313 redo size 4148 3