隨筆-314  評(píng)論-209  文章-0  trackbacks-0
          alter table test nologging
          insert /*+ append */ into test select
           
           
          ask tom上有過一篇文章,是說Oracle實(shí)際上需要滿足表是nologging和insert /*+append*/兩個(gè)條件才真正實(shí)現(xiàn)nologging的
           
           
          在insert數(shù)據(jù)量很大的時(shí)候(千萬級(jí)),減少redo的產(chǎn)生對(duì)性能應(yīng)該有很大的提高。
          這是一個(gè)使用append和nologging對(duì)redo產(chǎn)生情況的實(shí)驗(yàn)。
          結(jié)論:
          -------------------------------
          一、非歸檔模式下:
          沒有優(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
           
           
          1.Nologging的設(shè)置跟數(shù)據(jù)庫的運(yùn)行模式有關(guān)

          a.數(shù)據(jù)庫運(yùn)行在非歸檔模式下:

          SQL> archive log list;

          Database log mode              No Archive Mode
          Automatic archival             Enabled
          Archive destination            /opt/oracle/oradata/hsjf/archive
          Oldest online log sequence     155
          Current log sequence           157

          SQL> @redo

          SQL> create table test as select * from dba_objects where 1=0;

          Table created.

          SQL> select * from redo_size;

               VALUE
          ----------
               63392

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1150988

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1152368

          SQL> select (1152368 -1150988) redo_append,(1150988 -63392) redo from dual;

          REDO_APPEND       REDO
          ----------- ----------
                 1380    1087596

          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  235999908 bytes

          Fixed Size                   451236 bytes
          Variable Size             201326592 bytes
          Database Buffers           33554432 bytes
          Redo Buffers                 667648 bytes
          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;

               VALUE
          ----------
               56288

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1143948

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             2227712

          SQL> select (2227712 -1143948) redo_append,(1143948 -56288) redo from dual;

          REDO_APPEND       REDO
          ----------- ----------
              1083764    1087660

          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(*)
            from v$logmnr_contents
            group by operation;

          OPERATION                          COUNT(*)
          -------------------------------- ----------
          COMMIT                                   17
          DIRECT INSERT                         10470 
          INTERNAL                                 49
          START                                    17

          我們注意到這里是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;

               VALUE
          ----------
             2270284

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             3357644

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             3359024

          SQL> select (3359024 -3357644) redo_append,(3357644 - 2270284) redo from dual;

          REDO_APPEND       REDO
          ----------- ----------
                 1380    1087360

          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  235999908 bytes
          Fixed Size                   451236 bytes
          Variable Size             201326592 bytes
          Database Buffers           33554432 bytes
          Redo Buffers                 667648 bytes
          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;

               VALUE
          ----------
               56580

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1144148

          SQL>

          SQL> insert into test select * from dba_objects;

          10470 rows created.

          SQL> select * from redo_size;

               VALUE
          ----------
             1145528

          SQL> select (1145528 -1144148) redo_append,(1144148 -56580) redo from dual;

          REDO_APPEND       REDO
          ----------- ----------
                 1380    1087568

          SQL>

          posted on 2010-12-07 17:24 xzc 閱讀(1892) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 安龙县| 襄垣县| 垣曲县| 泾川县| 于田县| 云梦县| 巴中市| 福泉市| 太白县| 通道| 尚义县| 阿拉善左旗| 惠水县| 遵义县| 茂名市| 黎平县| 伊川县| 张家界市| 贵州省| 平乐县| 浮梁县| 高雄县| 工布江达县| 松溪县| 健康| 兴业县| 乳源| 齐河县| 彭山县| 宁德市| 威远县| 阿拉善盟| 临沧市| 巴里| 渝中区| 台安县| 云梦县| 天门市| 金堂县| 澄江县| 洪江市|