Nologging
更改表的日志记录方式
Alter table table_name nologging;
Alter table table_name logging;
数据库和表空间也可以定义日志记录模式,分为force logging,logging和nologging三种。
若数据库和表空间设置成了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、 对于常规的insert、update、delete操作仍然是会生成redo的。
Append(直接路径插入)
对于批量插入类似insert into t_1 select 语句可以使用直接路径插入方式进行优化。
关于直接路径插入
会在原来的高水位之上直接分配新的区间去存储插入的数据,不会利用高水位下面的空间。
直接路径插入效率更高是因为它会产生很少的undo,以及写undo产生的redo。对于存在索引的表,对索引的更改仍然会产生undo。
直接路径插入会在表级别加上6级别的锁,会阻止所有的DML操作。
直接路径插入适合大量数据插入的场景,因为它会绕过缓存,采用直接写的方式,所以在少量数据的情况下,性能不如常规插入。
使用直接路径插入的方式
Insert /*+append*/ into t_01 select
结合使用
一般情况下,append和nologging结合使用的效果是最好的。
但是对于非归档模式下,即使没有指定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'