测试环境在归档模式下进行,因为对于redo的产生,个人觉得与是否归档无关.是否归档本质上就是是否需要将重做日志备份(归档日志文件,介质恢复时需要).
查看数据库归档情况和日志属性 更改归档模式需要重启 alter database archivelog;
SQL> select log_mode,force_logging from v$database a ;
LOG_MODE FORCE_LOGGING
------------ ---------------
ARCHIVELOG YES
查看表空间的属性
SQL> select a.tablespace_name,logging,force_logging from dba_tablespaces a where
a.tablespace_name = 'TBS_DATA';
TABLESPACE_NAME LOGGING FORCE_LOGGING
------------------------------ --------- ---------------
TBS_DATA LOGGING YES
SQL> set autotrace trace stat
注:以下测试篇幅问题,出掉了统计信息里的部分内容
创建测试表
drop table tb_test1;
drop table tb_test2;
create table tb_test1 (site_name varchar(10)) tablespace tbs_data;
create table tb_test2 (site_name varchar(10)) tablespace tbs_data nologging;
insert into tb_test1 values ('S11');
insert into tb_test2 values ('S11');
insert into tb_test1 values ('S22');
insert into tb_test2 values ('S22');
SQL> insert into tb_test1 values ('S11');
已创建 1 行。
统计信息
----------------------------------------------------------
136 recursive calls
56 db block gets
31 consistent gets
6568 redo size
SQL> insert into tb_test2 values ('S11');
已创建 1 行。
统计信息
----------------------------------------------------------
136 recursive calls
60 db block gets
31 consistent gets
6268 redo size
SQL> insert into tb_test1 values ('S22');
已创建 1 行。
统计信息
----------------------------------------------------------
0 recursive calls
3 db block gets
1 consistent gets
244 redo size
SQL> insert into tb_test2 values ('S22');
已创建 1 行。
统计信息
----------------------------------------------------------
0 recursive calls
3 db block gets
1 consistent gets
0 physical reads
244 redo size
结论1:数据库强制归档,表空间强制归档,表级logging与nologging属性差异下,正常的insert的操作对 redo 的产生并没有太大的差异(反复执行脚本多次有几率出现nologging属性产生rode是logging属性的几倍)
删除表继续测试使用直接路径加载
drop table tb_test1;
drop table tb_test2;
create table tb_test1 (site_name varchar(10)) tablespace tbs_data;
create table tb_test2 (site_name varchar(10)) tablespace tbs_data nologging;
insert /*+append_values+*/into tb_test1 values ('S11');
insert /*+append_values+*/into tb_test2 values ('S11');
commit;
insert /*+append_values+*/into tb_test1 values ('S22');
insert /*+append_values+*/into tb_test2 values ('S22');
SQL> insert /*+append_values+*/into tb_test1 values ('S11');
已创建 1 行。
统计信息
----------------------------------------------------------
136 recursive calls
47 db block gets
30 consistent gets
0 physical reads
13848 redo size
SQL> insert /*+append_values+*/into tb_test2 values ('S11');
已创建 1 行。
统计信息
----------------------------------------------------------
136 recursive calls
41 db block gets
29 consistent gets
0 physical reads
13332 redo size
SQL> commit;
提交完成。
SQL> insert /*+append_values+*/into tb_test1 values ('S22');
已创建 1 行。
统计信息
----------------------------------------------------------
0 recursive calls
9 db block gets
2 consistent gets
0 physical reads
8628 redo size
SQL> insert /*+append_values+*/into tb_test2 values ('S22');
已创建 1 行。
统计信息
----------------------------------------------------------
0 recursive calls
8 db block gets
2 consistent gets
0 physical reads
8416 redo size
结论2:数据库强制归档,表空间强制归档,表级logging与nologging属性差异下,直接路径加载的操作对 redo 的产生并没有太大的差异(反复执行脚本多次有几率出现nologging属性产生rode是logging属性的几倍)
更改数据库以及表空间属性
SQL> alter database no force logging;
数据库已更改。
SQL> alter tablespace tbs_data no force logging;
表空间已更改。
SQL> insert into tb_test1 values ('S11');
已创建 1 行。
统计信息
----------------------------------------------------------
136 recursive calls
56 db block gets
31 consistent gets
0 physical reads
6376 redo size
SQL> insert into tb_test2 values ('S11');
已创建 1 行。
统计信息
----------------------------------------------------------
136 recursive calls
60 db block gets
31 consistent gets
0 physical reads
6268 redo size
SQL> insert into tb_test1 values ('S22');
已创建 1 行。
统计信息
----------------------------------------------------------
0 recursive calls
3 db block gets
1 consistent gets
0 physical reads
244 redo size
SQL> insert into tb_test2 values ('S22');
已创建 1 行。
统计信息
----------------------------------------------------------
0 recursive calls
3 db block gets
1 consistent gets
0 physical reads
244 redo size
结论3:数据库关闭强制归档,表空间关闭强制归档,表级logging与nologging,在正常的INSERT操作下无太大的差异
SQL> insert /*+append_values+*/into tb_test1 values ('S11');
已创建 1 行。
统计信息
----------------------------------------------------------
136 recursive calls
43 db block gets
30 consistent gets
0 physical reads
13848 redo size
SQL> insert /*+append_values+*/into tb_test2 values ('S11');
已创建 1 行。
统计信息
----------------------------------------------------------
136 recursive calls
42 db block gets
29 consistent gets
0 physical reads
5172 redo size
SQL> commit;
提交完成。
SQL> insert /*+append_values+*/into tb_test1 values ('S22');
已创建 1 行。
统计信息
----------------------------------------------------------
0 recursive calls
9 db block gets
2 consistent gets
0 physical reads
8628 redo size
SQL> insert /*+append_values+*/into tb_test2 values ('S22');
已创建 1 行。
统计信息
----------------------------------------------------------
0 recursive calls
8 db block gets
2 consistent gets
0 physical reads
196 redo size
SQL>
结论4:数据库关闭强制归档,表空间关闭强制归档,表级logging与nologging,在直接路径加载下 表级nologging属性下产生的redo大量的减少(以上为结果)
总结: 1.表空间级logging属性,只影响在该表空间建表时,默认的表logging属性.例如:tbs_data为nologing,在该表空间建表时,默认情况表的logging属性为no.修改表空间logging alter tablespace tbs_data nologging;
2.logging级别 数据库>表空间>表
当数据库,表空间都关闭 force logging 时,同时表级的有nologing属性,此时对于insert操作使用hint append直接路径加载将相对的减少redo的产生.
当数据库,表空间任意有一级别 force logging 开启时,覆盖了表级nologging属性,此时对insert操作使用hint append直接路径加载不但不会减少redo的产生,反而会产生更多的redo