GAGA LIFE.

インフラエンジニアブログ

スポンサーリンク

select ~ for update文でもredoが出る話

概要

通常、データ更新(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

スポンサーリンク