append和nologging的案例

shiyihai發表於2007-02-27

一 非歸檔模式下

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.

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/38542/viewspace-900611/,如需轉載,請註明出處,否則將追究法律責任。

相關文章