insert /*+ append */ into test select
這是一個(gè)使用append和nologging對(duì)redo產(chǎn)生情況的實(shí)驗(yàn)。
-------------------------------
一、非歸檔模式下:
沒有優(yōu)化前 (1281372 redo size)
1、單一的使用nologging參數(shù),對(duì)redo的產(chǎn)生沒有什么影響。 (1214836 redo size)
2、單一的使用append提示,redo的減少很顯著 (43872 redo size)
3、nologging+append,更顯著 (1108 redo size)
沒有優(yōu)化前:
1、單獨(dú)使用nologging參數(shù),(1231904 redo size)
2、單獨(dú)使用append提示, (1245804 redo size)
3、nologging + append, (3748 redo size)
a、使用nologging參數(shù)并不代表在dml操作中,oracle不產(chǎn)生redo,只是對(duì)于指定表的更新數(shù)據(jù)不產(chǎn)生redo,但是oracle還是要記錄這些操作,所以無論怎么優(yōu)化,dml操作肯定要產(chǎn)生redo,但是使用這些參數(shù)對(duì)redo size的影響還是非常可觀的。
b、單獨(dú)使用nologging參數(shù),對(duì)redo size沒有多少影響,只有和append配合時(shí),才能產(chǎn)生效果。
c、單獨(dú)使用append提示,對(duì)redo的產(chǎn)生影響很大,這是我到現(xiàn)在都不明白的道理,按說append是繞過freelists,直接去尋找新塊,能減少對(duì)freelists的爭用,為什么會(huì)少這么多redo呢?
d、歸檔模式和非歸檔模式下,參數(shù)影響不一樣,尤其是單獨(dú)使用append參數(shù)時(shí),看來oracle對(duì)歸檔模式下出于安全考慮還是要多一些。
文章出處:http://www.diybl.com/course/7_databases/oracle/Oracleshl/2008810/135707.html
a.數(shù)據(jù)庫運(yùn)行在非歸檔模式下:
SQL> archive log list;
Database log mode
Automatic archival
Archive destination
Oldest online log sequence
Current log sequence
SQL> @redo
SQL> create table test as select * from dba_objects where 1=0;
Table created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL> select (1152368 -1150988) redo_append,(1150988 -63392) redo from dual;
REDO_APPEND
----------- ----------
SQL> drop table test;
Table dropped.
我們看到在Noarchivelog模式下,對(duì)于常規(guī)表的insert append只產(chǎn)生少量redo
b.在歸檔模式下
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area
Fixed Size
Variable Size
Database Buffers
Redo Buffers
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> @redo
SQL> create table test as select * from dba_objects where 1=0;
Table created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL> select (2227712 -1143948) redo_append,(1143948 -56288) redo from dual;
REDO_APPEND
----------- ----------
SQL> drop table test;
Table dropped.
我們看到在歸檔模式下,對(duì)于常規(guī)表的insert append產(chǎn)生和insert同樣的redo
此時(shí)的insert append實(shí)際上并不會(huì)有性能提高.
但是此時(shí)的append是生效了的
通過Logmnr分析日志得到以下結(jié)果:
SQL> select operation,count(*)
OPERATION
-------------------------------- ----------
COMMIT
DIRECT INSERT
INTERNAL
START
我們注意到這里是DIRECT INSERT,而且是10470條記錄,也就是每條記錄都記錄了redo.
2.對(duì)于Nologging的table的處理
a. 在歸檔模式下:
SQL> create table test nologging as select * from dba_objects where 1=0;
Table created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL> select (3359024 -3357644) redo_append,(3357644 - 2270284) redo from dual;
REDO_APPEND
----------- ----------
SQL> drop table test;
Table dropped.
我們注意到,只有append才能減少redo
b.在非歸檔模式下:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area
Fixed Size
Variable Size
Database Buffers
Redo Buffers
Database mounted.
SQL> alter database noarchivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> @redo
SQL> create table test nologging as select * from dba_objects where 1=0;
Table created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL> select (1145528 -1144148) redo_append,(1144148 -56580) redo from dual;
REDO_APPEND
----------- ----------
SQL>