关闭日志对数据库性能的影响,如果表大,能一定程度缩短时间消耗,如果表小,效果并不明显。
如果性能是首要目标,可以考虑直接路径插入配合使用最小日志模式(nologging)
示例:
构造一个记录有100万左右的表
drop table t purge;
create table t as select * from dba_objects;
insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
commit;
测试普通插入:
SQL> drop table test;
SQL> create table test as select * from dba_objects where 1=2;
SQL> set timing on
SQL> insert into test select * from t;
已创建1166096行。
已用时间: 00: 00: 06.78
SQL> commit;
普通方式插入test表后输出的物理读(首次执行,看physical reads)
SQL> set autotrace traceonly
SQL> select count(*) from test;
测试直接路径读方式:
SQL> drop table test;
SQL> create table test as select * from dba_objects where 1=2;
SQL> set timing on
SQL> insert /*+ append */ into test select * from t;
已创建1166096行。
已用时间: 00: 00: 01.24
SQL> commit;
直接路径方式插入test表试验输出的物理读(首次执行,看physical reads)
SQL> set autotrace traceonly
SQL> select count(*) from test;
直接路径插入的限制
1)一张表同时只能有一个直接路径插入,因此不适合小数据量的插入,只适合大批量的数据加载;
2)在HWM下的空闲空间不会被利用;
3)一张表在做直接路径插入的同时,同一会话不能对其做任何操作(select都不可以);
4)只有insert inot ... select ... 语句、merge语句和使用OCI直接路径接口的应用程序才可以使用。
构造环境
建一个约600万条记录的表:
drop table t purge;
create table t as select * from dba_objects;
insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
--多插入几次,让数据大一点
insert into t select * from t;
insert into t select * from t;
commit;
测试nolgging关闭日志+直接路径读方式:
SQL> drop table test;
表已删除。
SQL> create table test as select * from dba_objects where 1=2;
表已创建。
SQL> alter table test nologging;
表已更改。
SQL> set timing on
SQL> insert /*+ append */ into test select * from t;
已创建4664384行。
已用时间: 00: 00: 04.39
经过测试,关闭日志确实减少了时间的消耗,但是如果数据量少,那么并不明显。