【优化批量插入】nologging和append使用解析

来源:互联网 发布:申请售后淘宝客佣金 编辑:程序博客网 时间:2024/06/04 18:26

Nologging

更改表的日志记录方式

Alter table table_name nologging;

Alter table table_name logging;

数据库和表空间也可以定义日志记录模式,分为force loggingloggingnologging三种。

若数据库和表空间设置成了force logging模式,则会覆盖表级别的设置,即对表设置nologging不会生效。

查看数据库和表空间的force logging设置

Select name,force_logging from v$database;

Select tablespace_name,force_logging,logging from dba_tablespaces;

 

Nologging模式下,有些点需要需要注意

1、 并不是设置了表级别的nologging参数就会不生成redo

它只是对个别操作以最少redo的方式产生redo。比如

insert into t_001 select

创建index或表重建。

append直接路径插入方式的操作

LOB大对象的操作。

而且设置了nologging并不是不生成redo,而是生成的比较少,针对操作过程中对系统表产生的redo还是会生成的。

 

2、 对于常规的insertupdatedelete操作仍然是会生成redo的。

 

 

Append(直接路径插入)

对于批量插入类似insert into t_1 select 语句可以使用直接路径插入方式进行优化。

关于直接路径插入

会在原来的高水位之上直接分配新的区间去存储插入的数据,不会利用高水位下面的空间。

直接路径插入效率更高是因为它会产生很少的undo,以及写undo产生的redo。对于存在索引的表,对索引的更改仍然会产生undo

直接路径插入会在表级别加上6级别的锁,会阻止所有的DML操作。

直接路径插入适合大量数据插入的场景,因为它会绕过缓存,采用直接写的方式,所以在少量数据的情况下,性能不如常规插入。

 

使用直接路径插入的方式

Insert  /*+append*/ into t_01 select

 

 

结合使用

一般情况下,appendnologging结合使用的效果是最好的。

但是对于非归档模式下,即使没有指定nologging参数,append操作也不会生成redo

 

测试用视图

通过以下sql可以查看自己的会话历史积累的redo size,在DML之前查看一下,DML之后再查看,差值就是DML操作产生的redo

select b.name, a.value

  from v$mystat a, v$statname b

 where a.STATISTIC# = b.STATISTIC#

   and b.name ='redo size'

 

0 0