<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks
    Oracle的Nologging何時生效 與 批量insert加載數據速度(zt)

    一 非歸檔模式下

    D:>sqlplus "/ as sysdba"

    數據庫版本為9.2.0.1.0

    SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 8月 14 10:20:39 2006

    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.



    連接到:
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.1.0 - Production

    當前session產生的redo
    SQL> create or replace view 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';

    視圖已建立。

    授權給相應數據庫schema
    SQL> grant select on redo_size to liyong;

    授權成功。

    SQL> shutdown immediate;
    數據庫已經關閉。
    已經卸載數據庫。
    ORACLE 例程已經關閉。

    SQL> startup mount;
    ORACLE 例程已經啟動。

    Total System Global Area 122755896 bytes
    Fixed Size 453432 bytes
    Variable Size 88080384 bytes
    Database Buffers 33554432 bytes
    Redo Buffers 667648 bytes
    數據庫裝載完畢。

    非歸檔模式
    SQL> alter database noarchivelog;

    數據庫已更改。

    SQL> alter database open;

    數據庫已更改。

    SQL> create table redo_test as
    2 select * from all_objects where 1=2;

    表已創建。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    59488

    SQL> insert into redo_test
    2 select * from all_objects;

    已創建28260行。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    3446080

    SQL> insert /*+ append */ into redo_test
    2 select * from all_objects;

    已創建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    3458156

    可以看到insert /*+ append */ into方式redo產生很少.
    SQL> select 3446080-59488,3458156-3446080 from dual;

    3446080-59488 3458156-3446080
    ------------- ---------------
    3386592 12076

    將表redo_test置為nologging狀態.
    SQL> alter table redo_test nologging;

    表已更改。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    3460052

    SQL> insert into redo_test
    2 select * from all_objects;

    已創建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    6805876

    SQL> insert /*+ append */ into redo_test
    2 select * from all_objects;

    已創建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    6818144

    非歸檔模式下表的nologging狀態對于redo影響不大
    SQL> select 6805876-3460052,6818144-6805876 from dual;

    6805876-3460052 6818144-6805876
    --------------- ---------------
    3345824 12268


    結論: 在非歸檔模式下通過insert /*+ append */ into方式批量加載數據可以大大減少redo產生.

    二 歸檔模式下


    SQL> shutdown immediate;
    數據庫已經關閉。
    已經卸載數據庫。
    ORACLE 例程已經關閉。
    SQL> startup mount;
    ORACLE 例程已經啟動。

    Total System Global Area 122755896 bytes
    Fixed Size 453432 bytes
    Variable Size 88080384 bytes
    Database Buffers 33554432 bytes
    Redo Buffers 667648 bytes
    數據庫裝載完畢。
    SQL> alter database archivelog;

    數據庫已更改。

    SQL> alter database open;

    數據庫已更改。

    SQL> conn liyong
    請輸入口令:
    已連接。


    將表redo_test重新置為logging
    SQL> alter table redo_test logging;

    表已更改。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    5172

    SQL> insert into redo_test
    2 select * from all_objects;

    已創建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    3351344

    SQL> insert /*+ append */ into redo_test
    2 select * from all_objects;

    已創建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    6659932

    可以看到在歸檔模式下,且表的logging屬性為true,insert /*+ append */ into這種方式也會紀錄大量redo
    SQL> select 3351344-5172,6659932-3351344 from dual;

    3351344-5172 6659932-3351344
    ------------ ---------------
    3346172 3308588


    將表置為nologging

    SQL> alter table redo_test nologging;

    表已更改。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    6661820

    SQL> insert into redo_test
    2 select * from all_objects;

    已創建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    10008060

    SQL> insert /*+ append */ into redo_test
    2 select * from all_objects;

    已創建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    10022852

    可以發現在歸檔模式,要設置表的logging屬性為false,才能通過insert /*+ append */ into大大減少redo產生.
    SQL> select 10008060-6661820,10022852-10008060 from dual;

    10008060-6661820 10022852-10008060
    ---------------- -----------------
    3346240 14792

    結論: 在歸檔模式下,要設置表的logging屬性為false,
    才能通過insert /*+ append */ into大大減少redo.

    三 下面我們再看一下在歸檔模式下,幾種批量insert操作的效率對比.

    redo_test表有45W條記錄

    SQL> select count(*) from redo_test;

    COUNT(*)
    ----------
    452160


    1 最常見的批量數據加載 25秒

    SQL> create table insert_normal as
    2 select * from redo_test where 0=2;

    表已創建。

    SQL> set timing on

    SQL> insert into insert_normal
    2 select * from redo_test;

    已創建452160行。

    提交完成。
    已用時間: 00: 00: 25.00


    2 使用insert /*+ append */ into方式(這個的原理可以參見<<批量DML操作優化建議.txt>>),但紀錄redo. 17.07秒
    SQL> create table insert_hwt
    2 as
    3 select * from redo_test where 0=2;

    表已創建。
    SQL> insert /*+ append */ into insert_hwt
    2 select * from redo_test;

    已創建452160行。

    提交完成。
    已用時間: 00: 00: 17.07


    3 使用insert /*+ append */ into方式,且通過設置表nologging不紀錄redo.

    SQL> create table insert_hwt_with_nologging nologging
    2 as
    3 select * from redo_test where 2=0;

    表已創建。

    /*
    或者通過
    alter table table_name nologging設置
    */

    SQL> insert /*+ append */ into insert_hwt_with_nologging 11.03秒
    2 select * from redo_test;

    已創建452160行。

    提交完成。
    已用時間: 00: 00: 11.03

    總結:

    我們看到對于批量操作,如果設置表nologging,可以大大提高性能.原因就是Oracle沒有紀錄DML所產生的redo.
    當然,這樣會影響到備份。nologging加載數據后要做數據庫全備.

    jolly10 發表于:2008.03.18 13:19 ::分類: ( 轉載學習內容 ) ::閱讀:(1097次) :: 評論 (3) :: 引用 (0)
    re: Oracle的Nologging何時生效 與 批量insert加載數據速度(zt) [回復]

    下面我又試了試insert into XXX values (XXX)能不能少產生redo,做了試驗發現,不行的,下面的過程.
    SQL> select * from v$version where rownum archive log list;
    Database log mode No Archive Mode
    Automatic archival Disabled
    Archive destination USE_DB_RECOVERY_FILE_DEST
    Oldest online log sequence 17
    Current log sequence 19

    SQL> create or replace view 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';

    View created.

    SQL> grant select on redo_size to ljg;

    SQL> conn ljg/ljg
    Connected.

    SQL> create table redo_test as
    2 select * from all_objects where 1=2;

    SQL> CREATE OR REPLACE PROCEDURE p_loging
    2 as
    3 CURSOR c_a IS
    4 SELECT * FROM all_objects;
    5
    6 BEGIN
    7 FOR x IN c_a LOOP
    8 INSERT INTO REDO_TEST
    9 VALUES(x.OWNER, x.OBJECT_NAME, x.SUBOBJECT_NAME, x.OBJECT_ID, x.DATA_OBJE CT_ID,
    10 x.OBJECT_TYPE, x.CREATED, x.LAST_DDL_TIME, x.TIMESTAMP, x.STATUS, x.TEMPORARY, x.GENERATED, x.SECONDARY);
    11 END LOOP;
    12 COMMIT;
    13
    14 END;
    15 /

    Procedure created.

    SQL> CREATE OR REPLACE PROCEDURE p_nologing
    2 as
    3 CURSOR c_a IS
    4 SELECT * FROM all_objects;
    5
    6 BEGIN
    7 FOR x IN c_a LOOP
    8 INSERT /*+ APPEND */ INTO REDO_TEST
    9 VALUES(x.OWNER, x.OBJECT_NAME, x.SUBOBJECT_NAME, x.OBJECT_ID, x.DATA_OBJECT_ID,
    10 x.OBJECT_TYPE, x.CREATED, x.LAST_DDL_TIME, x.TIMESTAMP, x.STATUS, x.TEMPORARY, x.GENERATED, x.SECONDARY);
    11 END LOOP;
    12 COMMIT;
    13
    14 END;
    15 /

    Procedure created.

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    85940

    SQL> exec p_loging;

    PL/SQL procedure successfully completed.

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    15273968

    SQL> exec p_nologing;

    PL/SQL procedure successfully completed.

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    30411272

    SQL> select 15273968- 85940 logging,30411272-15273968 nologging from dual;

    LOGGING NOLOGGING
    ---------- ----------
    15188028 15137304

    可以看到nologging和logging產生的redo差不多.

    jolly10 評論于:2008.06.05 11:07
    re: Oracle的Nologging何時生效 與 批量insert加載數據速度(zt) [回復]

    下面我又試了試insert into XXX values (XXX)能不能少產生redo,做了試驗發現,不行的,下面的過程.
    SQL> select * from v$version where rownum archive log list;
    Database log mode No Archive Mode
    Automatic archival Disabled
    Archive destination USE_DB_RECOVERY_FILE_DEST
    Oldest online log sequence 17
    Current log sequence 19

    SQL> create or replace view 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';

    View created.

    SQL> grant select on redo_size to ljg;

    SQL> conn ljg/ljg
    Connected.

    SQL> create table redo_test as
    2 select * from all_objects where 1=2;

    SQL> CREATE OR REPLACE PROCEDURE p_loging
    2 as
    3 CURSOR c_a IS
    4 SELECT * FROM all_objects;
    5
    6 BEGIN
    7 FOR x IN c_a LOOP
    8 INSERT INTO REDO_TEST
    9 VALUES(x.OWNER, x.OBJECT_NAME, x.SUBOBJECT_NAME, x.OBJECT_ID, x.DATA_OBJE CT_ID,
    10 x.OBJECT_TYPE, x.CREATED, x.LAST_DDL_TIME, x.TIMESTAMP, x.STATUS, x.TEMPORARY, x.GENERATED, x.SECONDARY);
    11 END LOOP;
    12 COMMIT;
    13
    14 END;
    15 /

    Procedure created.

    SQL> CREATE OR REPLACE PROCEDURE p_nologing
    2 as
    3 CURSOR c_a IS
    4 SELECT * FROM all_objects;
    5
    6 BEGIN
    7 FOR x IN c_a LOOP
    8 INSERT /*+ APPEND */ INTO REDO_TEST
    9 VALUES(x.OWNER, x.OBJECT_NAME, x.SUBOBJECT_NAME, x.OBJECT_ID, x.DATA_OBJECT_ID,
    10 x.OBJECT_TYPE, x.CREATED, x.LAST_DDL_TIME, x.TIMESTAMP, x.STATUS, x.TEMPORARY, x.GENERATED, x.SECONDARY);
    11 END LOOP;
    12 COMMIT;
    13
    14 END;
    15 /

    Procedure created.

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    85940

    SQL> exec p_loging;

    PL/SQL procedure successfully completed.

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    15273968

    SQL> exec p_nologing;

    PL/SQL procedure successfully completed.

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    30411272

    SQL> select 15273968- 85940 logging,30411272-15273968 nologging from dual;

    LOGGING NOLOGGING
    ---------- ----------
    15188028 15137304

    可以看到nologging和logging產生的redo差不多.

    jolly10 評論于:2008.06.05 11:07
    re: Oracle的Nologging何時生效 與 批量insert加載數據速度(zt) [回復]

    在ITPUB中問到可以用BULK COLLECT 來減少insert into values的redo.
    CREATE OR REPLACE PROCEDURE p_BulkAdd
    AS
    TYPE Tredo_test IS TABLE OF REDO_TEST%ROWTYPE;
    V_REDO_TEST Tredo_test;
    BEGIN
    SELECT * BULK COLLECT INTO V_REDO_TEST FROM ALL_OBJECTS;
    FORALL X IN V_REDO_TEST.FIRST..V_REDO_TEST.LAST
    INSERT INTO REDO_TEST VALUES V_REDO_TEST(X);
    END;
    /

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    30411272

    SQL> exec p_bulkadd;

    PL/SQL procedure successfully completed.

    SQL> select * from sys.redo_size;

    VALUE
    ----------
    35050796

    SQL> select 35050796-30411272 from dual;

    35050796-30411272
    -----------------
    4639524

    這個做的確是少了很多redo.是一個方法.

    posted on 2009-12-18 13:11 小菜毛毛 閱讀(6118) 評論(0)  編輯  收藏 所屬分類: 數據庫
    主站蜘蛛池模板: 一二三四影视在线看片免费| 免费无码又爽又刺激聊天APP| 亚洲最新永久在线观看| 97热久久免费频精品99| 国产精品亚洲精品久久精品| 国产日产亚洲系列| 麻豆高清免费国产一区| 国产精品亚洲一区二区三区久久 | 亚欧免费一级毛片| 亚洲一区二区三区高清在线观看| vvvv99日韩精品亚洲| 日本一卡精品视频免费| 亚洲av乱码中文一区二区三区| 亚洲色WWW成人永久网址| 在线视频免费观看高清| 美女无遮挡拍拍拍免费视频| 亚洲综合伊人制服丝袜美腿| 亚洲精品无码AV中文字幕电影网站| 伊人久久免费视频| 又硬又粗又长又爽免费看| 亚洲成av人片在线看片| 国外亚洲成AV人片在线观看 | 国产av无码专区亚洲av果冻传媒 | 最近最新高清免费中文字幕| 免费人成网上在线观看| 亚洲一区中文字幕在线观看| 久久亚洲中文字幕精品一区| 成年男女男精品免费视频网站| a毛片免费在线观看| 亚洲av综合日韩| 亚洲人成在线中文字幕| 亚洲国产精品无码久久久秋霞2| 国产高清在线免费| 青娱分类视频精品免费2| 特级做A爰片毛片免费看无码 | 又粗又黄又猛又爽大片免费| 国产v精品成人免费视频400条| 国产拍拍拍无码视频免费| 特级毛片aaaa免费观看| 亚洲国产精品99久久久久久| 亚洲中文字幕人成乱码|