测量redo
可以 通过两种方式测量redo
1、统计信息 set autotrace traceonly statistics; --只能查看部分操作产生的redo大小
2、通过自定义一个函数
1、通过统计信息查看
SQL> set autotrace traceonly statistics;
SQL> create table test_a as select * from dba_objects;
Table created.
SQL> delete from test_a;
75294 rows deleted.
Statistics
----------------------------------------------------------
150 recursive calls
82060 db block gets
1210 consistent gets
1072 physical reads
28539260 redo size
843 bytes sent via SQL*Net to client
774 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
75294 rows processed
可以看到delete命令产生了大约27M的redo,也可以看到,利用sqlplus 的autotrace无法看到create table语句产生的redo,autotrace的统计信息只能处理简单的DML语句的redo,其他操作,可以通过创建一个函数来获取。
2、通过自定义一个函数 get_stat_val
SQL> create or replace function get_stat_val( p_name in varchar2 ) return number
2 as
3 l_val number;
4 begin
5 select b.value
6 into l_val
7 from v$statname a, v$mystat b
8 where a.statistic# = b.statistic#
9 and a.name = p_name;
10
11 return l_val;
12 end;
13 /
Function created.
查看CTAS方式创建表产生的redo
SQL> set serveroutput on;
SQL> variable redo number
SQL> exec :redo :=get_stat_val('redo size');
SQL> create table test_c as select * from dba_objects;
Table created.
SQL> exec dbms_output.put_line((get_stat_val('redo size')-:redo)|| ' byte of redo....');
8862332 byte of redo....
PL/SQL procedure successfully completed.
可以看到生成了大约8M的redo。
环境在archive mode 下,使用nologging属性,会明显减少redo的生成
SQL> variable redo number;
SQL> execute :redo :=get_stat_val('redo size');
PL/SQL procedure successfully completed.
SQL> create table test_d nologging as select * from dba_objects;
Table created.
SQL> exec dbms_output.put_line((get_stat_val('redo size')-:redo)|| ' byte of redo....');
74636 byte of redo....
PL/SQL procedure successfully completed.
--只有大约7K的redo生成,比起8M 少了很多。也能说明,使用了nologging子句,就并不是完全不生成redo,只是相比logging,生成很少量的redo
在sql中设置nologging
有些SQL语句和操作支持使用nologging子句。这并不像字面意思那样,完全不生成redo。无论日志模式是archivelog 还是 noarchivelog 模式,所有的操作都会生成一些redo。
所有对数据字典的修改都会生成redo。如果在NOARCHIVELOG模式,除了对数据字典的修改外,create table 是不会记录日志。
关于nologging,注意一下几点:
1、使用了nologging子句,还是会生成redo,这些redo的左右是保护数据字典。不过与logging相比,生成的redo量很少。
2、nologging不能避免所有的操作减少生成redo。比如,create table 不生成日志,但是后续的insert 、update等在表上的操作依然会产生日志。
3、在一个archivelog mode下,在数据库执行了nologging操作后,应尽快为受影响的数据文件建立新的备份。因为nologging减少了日志记录。假如出现数据丢失,归档日志文件中又没有包含这些操作的日志记录,无法恢复。
小结:
可以采用nologging模式执行一下操作:
1、索引的创建和ALTER(重建)
2、表的批量INSERT (通过/*+ APPEND */HINT 提示使用直接路径,或者sqlloder direct path 加载)。此时加载数据不会产生redo。但是假如表上有索引,由于插入数据导致的索引自动维护依然会产生redo。
3、LOB操作
4、通过CTAS创建表
5、各种ALTER TABLE操作,比如 MOVE SPLIT等等。