前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >相同更改数据量的前提下,单次COMMIT和多次COMMIT对日志空间浪费的影响对比

相同更改数据量的前提下,单次COMMIT和多次COMMIT对日志空间浪费的影响对比

作者头像
bisal
发布2019-01-29 11:26:00
5510
发布2019-01-29 11:26:00
举报

LGWR进程按照顺序写在线日志,中间不会跳跃,而且LGWR进程不会在同一个日志快写2次,即使一次写入的日志快只占几个字节,下次不会再用了,这就造成日志空间的浪费。Oracle做一次Commit,就会触发LGWR进程进行日志缓冲到日志文件的写入操作,因此可以说更改相同数据量的前提下,如果提交过于频繁,产生的日志可能就会越多,即使第一次Commit占用的日志块仍可以存储下一次需要写入的日志缓冲,那么下一次Commit会再次占用一个新的日志块。

实验:

1、系统的日志块大小是512字节。

SQL> select max(lebsz) from sys.x$kccle;

MAX(LEBSZ)

----------

       512

2、创建两张相同数据量的表。

SQL> select count(*) from t1;

  COUNT(*)

----------

     11188

SQL> select count(*) from t2;

  COUNT(*)

----------

     11188

3、查看删除t1表前系统的浪费日志空间量。

SQL> select name, value from v$sysstat where name like '%wastage%';

NAME                                              VALUE

---------------------------------------------------------------- ----------

redo wastage                                        208060

4、逐条删除t1表的记录。

SQL> begin

  2  for i in 1 .. 11188 loop

  3  delete from t1 where rownum < 2;

  4  commit;

  5  end loop;

  6  end;

  7  /

5、再次查看日志空间浪费量。

SQL> select name, value from v$sysstat where name like '%wastage%';

NAME                                              VALUE

---------------------------------------------------------------- ----------

redo wastage                                       1118740

SQL> select 1118740-208060 from dual;

1118740-208060

--------------

     910680

浪费日志空间量是910680字节。

6、查看当前进程的SID。

SQL> select distinct sid from v$mystat;

       SID

----------

       215

进而查出当前进程消耗的redo量总大小。

SQL> select b.name, a.value from v$sesstat a, v$statname b

  2  where a.statistic#=b.statistic#

  3  and b.name like '%redo size%'

  4  and a.sid=215;

NAME                 VALUE

-------------------- ----------

redo size          9103304

可知日志空间浪费比率有10%

SQL> select 910680/9103304 from dual;

910680/9103304

--------------

    .100038404

7、接下来选择一次性删除t2表记录,之前记录下日志空间浪费大小。

SQL> select name, value from v$sysstat where name like '%wastage%';

NAME                 VALUE

-------------------- ----------

redo wastage          1130636

SQL> delete from t2;

11188 rows deleted.

SQL> commit;

Commit complete.

8、查看当前日志空间浪费。

SQL> select name, value from v$sysstat where name like '%wastage%';

NAME                 VALUE

-------------------- ----------

redo wastage          1132060

9、计算日志浪费空间比率。

SQL> select 1132060-1130636 from dual;

1132060-1130636

---------------

        1424

SQL> select b.name, a.value from v$sesstat a, v$statname b

  2  where a.statistic#=b.statistic#

  3  and b.name like '%redo size%'

  4  and a.sid=215;

NAME                 VALUE

-------------------- ----------

redo size            13154544

SQL> select 1424/13154544 from dual;

1424/13154544

-------------

   .000108252

从结果看,日志空间浪费比率仅为0.01%。

结论:

1、LGWR进程按照顺序将日志缓冲写入日志块,不会在同一个日志块中写入两次,就可能造成上一次写入的最后一个日志块会有空间的浪费,但下一次不能再使用,只能再次写入一个新的日志块。

2、相同更改数据量的前提下,多次提交Commit要比一次Commit浪费更多的日志块空间。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年07月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档