关于oracle数据库,表空间,表级的logging属性与hint append

测试环境在归档模式下进行,因为对于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
        
        
       


      



你可能感兴趣的:(oracle数据库优化)