oracle 查看操作生成redo、undo

测量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等等。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值