暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

Oracle 查看Redo产生多少

原创 布衣 2023-10-26
1092

前言

  作为一名DBA,应该学会测量这种操作生成多少redo,这点很重要,要知道,生成的Redo量越多,你的操作花费的时间就越长,整个系统也会越慢,掌握这一点方便对评审开发提供的操作代码。
  Redo 管理是数据库中的一个串行点,任何Oracle 实例都只有一个LGWR,最终所有事务都会汇集到LGWR。LGWR要做的越多,系统就越慢。

  • 注:12C起,Oracle 会自动地在多处理器平台上启动多个日志进程(LG00),以此来提高重做日志的写入性能。

1、AUTOTRACE

  使用SQL*Plus的内置特性AUTOTRACE,来查看生成的redo量,不过只能用于简单的DML,对其他操作(存储过程)就无能为力了。
未例:

SQL> set autotrace traceonly statistics; SQL> insert into t select * from dba_tables; 3646 rows created. Statistics ---------------------------------------------------------- 82 recursive calls 730 db block gets 4823 consistent gets 0 physical reads 1013552 redo size 833 bytes sent via SQL*Net to client 791 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 3 sorts (memory) 0 sorts (disk) 3646 rows processed

2、利用TOM编程艺术里的脚本来计算redo和undo大小

创建函数:get_stat_val

create or replace function get_stat_val(p_name in varchar2) return number as l_val number; begin select b.value into l_val from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name = p_name; return l_val; end;
  • 调用
set serveroutput on 
-- redo size
exec dbms_output.put_line(get_stat_val('redo size')/1024 || 'KB');
1106.28125KB
-- undo size 
exec dbms_output.put_line(get_stat_val('undo change vector size')/1024 || 'KB');
55.9453125KB

  查看REDO与UNDO大小方式:首先进行DML语句,不进行commit,查看产生的UNDO大小,然后commit,再查看产生的REDO大小。
另外,ROLLBACK操作也会产生相应的REDO。

 variable redo number
 variable undo number
 exec :redo := get_stat_val('redo size');
 exec :undo := get_stat_val('undo change vector size');
 insert into t select * from dba_tables;
 exec dbms_output.put_line((get_stat_val('undo change vector size') - :undo) || ' bytes of undo generated!');
 132 bytes of undo generated!
 commit;
 exec dbms_output.put_line((get_stat_val('redo size') - :redo) || ' bytes of redo generated!');
 512 bytes of redo generated!
  • 来自TOM编程艺术里的脚本:一个小存储过程,它能执行任意SQL,并报告SQL生成的redo量
create or replace procedure do_sql(p_sql in varchar2) as l_start_redo number; l_redo number; begin l_start_redo := get_stat_val('redo size'); execute immediate p_sql; commit; l_redo:=get_stat_val('redo size') - l_start_redo dbms_output.put_line(to_char(l_redo,'99,999,999')|| ' bytes of redo generated for "'||substr(replace(p_sql,chr(10),' '),1,25)|| '"...'); end; /

3、临时表与redo/undo

  • 12c之前
    临时表的数据块不会生成redo。当你修改临时表中的一个块时,这个修改不会记录到重做日志文件中。不过,临时表会生成undo,而且这个undo会记入日志。因此,临时表生成的redo是undo所产生的。

关于临时表上的DML活动,总结出以下结论:

  1. 对永久表的insert生成大量redo,面对于临时表几乎没有生成任何redo。因为对于临时表的insert 只会生成很少的undo数据,而且临时表只会为undo数据建立redo日志。
  2. 对于永久表的update生成的redo大约是临时表所生成redo的2倍。因为两种表都必须保存update的前映像,但对于临时表来说,不必保存“后映像”redo
  3. 两种表的delete操作需要几乎相同的redo空间。因为delete产生undo量很大,而redo很小。

另:索引修改也会生成undo,进一步生成redo。

  • 12c之后
    12c起,我们可以通过设置参数TEMP_UNDO_ENABLE来将临时表的undo放在临时表空间中。当这个参数设置为TRUE时,任何临时表上的DML都会产生很少甚至不产生redo。
    TEMP_UNDO_ENABLE默认值为FASE,如果不将其改为TRUE的话,那临时表生成的redo量与12c之前是一样的。
  • 修改会话级别设置:
alter session set TEMP_UNDO_ENABLE=true;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论