前言
作为一名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活动,总结出以下结论:
- 对永久表的insert生成大量redo,面对于临时表几乎没有生成任何redo。因为对于临时表的insert 只会生成很少的undo数据,而且临时表只会为undo数据建立redo日志。
- 对于永久表的update生成的redo大约是临时表所生成redo的2倍。因为两种表都必须保存update的前映像,但对于临时表来说,不必保存“后映像”redo
- 两种表的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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




