ORACLE 的 append 和 nologging

一 非归档模式下
C:Documents and Settingsshiyihai>sqlplus /nolog
SQL*Plus: Release 9.2.0.6.0 - Production on 星期二 2月 27 11:42:43 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> conn / as sysdba
已连接。
SQL>
当前session产生的redo
SQL> create or replace view v_session_redo_size
2 as
3 select value
4 from v$mystat, v$statname
5 where v$mystat.statistic# = v$statname.statistic#
6 and v$statname.name = 'redo size';
视图已建立。
SQL>
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 C:oracleoradataarchora9i
最早的概要日志序列 257
下一个存档日志序列 259
当前日志序列 259
(这里执行alter database noarchivelog将抛"ORA-01126: 对于此操作,数据库必须以 EXCLUSIVE 模式安装且未打开")
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 135864308 bytes
Fixed Size 454644 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 1191936 bytes
数据库装载完毕。
SQL>
置数据库为非归档模式:
SQL> alter database noarchivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL>
SQL> create table temp_test_redo as
2 select * from all_objects where 1=2;
表已创建。

SQL> select * from v_session_redo_size;
VALUE
----------
144244
SQL>
SQL> insert into temp_test_redo
2 select * from all_objects;
已创建28772行。

SQL> select * from v_session_redo_size;
VALUE
----------
3342404
SQL>
SQL> insert /*+ append */ into temp_test_redo
2 select * from all_objects;
已创建28772行。
SQL> select * from v_session_redo_size;
VALUE
----------
3347556
SQL>
SQL> select 3342404-144244,3347556-3342404 from dual;
3342404-144244 3347556-3342404
-------------- ---------------
3198160 5152
SQL>
可以看到insert /*+ append */ into方式redo产生很少.
下面将表temp_test_redo置为nologging状态.
SQL> alter table temp_test_redo nologging;
表已更改。
SQL> commit;
提交完成。
SQL> select * from v_session_redo_size;
VALUE
----------
3349828
SQL>
SQL> insert into temp_test_redo
2 select * from all_objects;
已创建28772行。
SQL> select * from v_session_redo_size;
VALUE
----------
6519692
SQL>
SQL> insert /*+ append */ into temp_test_redo
2 select * from all_objects;
已创建28772行。
SQL> select * from v_session_redo_size;
VALUE
----------
6524952
SQL>
非归档模式下表的nologging状态对于redo影响不大
SQL> select 6519692-3349828,6524952-6519692 from dual;
6519692-3349828 6524952-6519692
--------------- ---------------
3169864 5260
SQL>
结论: 在非归档模式下通过insert /*+ append */ into方式批量加载数据可以大大减少redo产生,
但表的nologging状态并不对redo产生太大的影响.


二 归档模式下
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 135864308 bytes
Fixed Size 454644 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 1191936 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> alter table temp_test_redo logging;
表已更改。
SQL> select * from v_session_redo_size;
VALUE
----------
102552
SQL>
SQL> insert into temp_test_redo
2 select * from all_objects;
已创建28772行。
SQL> select * from v_session_redo_size;
VALUE
----------
3273740
SQL>
SQL> insert /*+ append */ into temp_test_redo
2 select * from all_objects;
已创建28772行。
SQL> select * from v_session_redo_size;
VALUE
----------
6509596
SQL>
可以看到在归档模式下,且表的logging属性为true,insert /*+ append */ into这种方式也会纪录大量redo
SQL> select 3273740-102552,6509596-3273740 from dual;
3273740-102552 6509596-3273740
-------------- ---------------
3171188 3235856
SQL>

将表置为nologging
SQL> alter table temp_test_redo nologging;
表已更改。
SQL> select * from v_session_redo_size;
VALUE
----------
6511868
SQL>
SQL> insert into temp_test_redo
2 select * from all_objects;
已创建28772行。
SQL> select * from v_session_redo_size;
VALUE
----------
9681984
SQL>
SQL> insert /*+ append */ into temp_test_redo
2 select * from all_objects;
已创建28772行。
SQL> select * from v_session_redo_size;
VALUE
----------
9687244
SQL>
可以发现在归档模式,要设置表的logging属性为false,才能通过insert /*+ append */ into大大减少redo产生.
SQL> select 9681984-6511868,9687244-9681984 from dual;
9681984-6511868 9687244-9681984
--------------- ---------------
3170116 5260
SQL>
结论: 在归档模式下,要设置表的logging属性为false,才能通过insert /*+ append */ into大大减少redo.

你可能感兴趣的:(oracle,sql,C++,c,C#)