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

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

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

    小菜毛毛技術(shù)分享

    與大家共同成長(zhǎng)

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

    一 非歸檔模式下

    D:>sqlplus "/ as sysdba"

    數(shù)據(jù)庫版本為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

    當(dāng)前session產(chǎn)生的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';

    視圖已建立。

    授權(quán)給相應(yīng)數(shù)據(jù)庫schema
    SQL> grant select on redo_size to liyong;

    授權(quán)成功。

    SQL> shutdown immediate;
    數(shù)據(jù)庫已經(jīng)關(guān)閉。
    已經(jīng)卸載數(shù)據(jù)庫。
    ORACLE 例程已經(jīng)關(guān)閉。

    SQL> startup mount;
    ORACLE 例程已經(jīng)啟動(dòng)。

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

    非歸檔模式
    SQL> alter database noarchivelog;

    數(shù)據(jù)庫已更改。

    SQL> alter database open;

    數(shù)據(jù)庫已更改。

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

    表已創(chuàng)建。

    SQL> select * from sys.redo_size;

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

    SQL> insert into redo_test
    2 select * from all_objects;

    已創(chuàng)建28260行。

    SQL> select * from sys.redo_size;

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

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

    已創(chuàng)建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

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

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

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

    將表redo_test置為nologging狀態(tài).
    SQL> alter table redo_test nologging;

    表已更改。

    SQL> select * from sys.redo_size;

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

    SQL> insert into redo_test
    2 select * from all_objects;

    已創(chuàng)建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

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

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

    已創(chuàng)建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

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

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

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


    結(jié)論: 在非歸檔模式下通過insert /*+ append */ into方式批量加載數(shù)據(jù)可以大大減少redo產(chǎn)生.

    二 歸檔模式下


    SQL> shutdown immediate;
    數(shù)據(jù)庫已經(jīng)關(guān)閉。
    已經(jīng)卸載數(shù)據(jù)庫。
    ORACLE 例程已經(jīng)關(guān)閉。
    SQL> startup mount;
    ORACLE 例程已經(jīng)啟動(dòng)。

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

    數(shù)據(jù)庫已更改。

    SQL> alter database open;

    數(shù)據(jù)庫已更改。

    SQL> conn liyong
    請(qǐng)輸入口令:
    已連接。


    將表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;

    已創(chuàng)建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

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

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

    已創(chuàng)建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

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

    可以看到在歸檔模式下,且表的logging屬性為true,insert /*+ append */ into這種方式也會(huì)紀(jì)錄大量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;

    已創(chuàng)建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

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

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

    已創(chuàng)建28260行。

    SQL> commit;

    提交完成。

    SQL> select * from sys.redo_size;

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

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

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

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

    三 下面我們?cè)倏匆幌略跉w檔模式下,幾種批量insert操作的效率對(duì)比.

    redo_test表有45W條記錄

    SQL> select count(*) from redo_test;

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


    1 最常見的批量數(shù)據(jù)加載 25秒

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

    表已創(chuàng)建。

    SQL> set timing on

    SQL> insert into insert_normal
    2 select * from redo_test;

    已創(chuàng)建452160行。

    提交完成。
    已用時(shí)間: 00: 00: 25.00


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

    表已創(chuàng)建。
    SQL> insert /*+ append */ into insert_hwt
    2 select * from redo_test;

    已創(chuàng)建452160行。

    提交完成。
    已用時(shí)間: 00: 00: 17.07


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

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

    表已創(chuàng)建。

    /*
    或者通過
    alter table table_name nologging設(shè)置
    */

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

    已創(chuàng)建452160行。

    提交完成。
    已用時(shí)間: 00: 00: 11.03

    總結(jié):

    我們看到對(duì)于批量操作,如果設(shè)置表nologging,可以大大提高性能.原因就是Oracle沒有紀(jì)錄DML所產(chǎn)生的redo.
    當(dāng)然,這樣會(huì)影響到備份。nologging加載數(shù)據(jù)后要做數(shù)據(jù)庫全備.

    jolly10 發(fā)表于:2008.03.18 13:19 ::分類: ( 轉(zhuǎn)載學(xué)習(xí)內(nèi)容 ) ::閱讀:(1097次) :: 評(píng)論 (3) :: 引用 (0)
    re: Oracle的Nologging何時(shí)生效 與 批量insert加載數(shù)據(jù)速度(zt) [回復(fù)]

    下面我又試了試insert into XXX values (XXX)能不能少產(chǎn)生redo,做了試驗(yàn)發(fā)現(xiàn),不行的,下面的過程.
    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產(chǎn)生的redo差不多.

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

    下面我又試了試insert into XXX values (XXX)能不能少產(chǎn)生redo,做了試驗(yàn)發(fā)現(xiàn),不行的,下面的過程.
    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產(chǎn)生的redo差不多.

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

    在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

    這個(gè)做的確是少了很多redo.是一個(gè)方法.

    posted on 2009-12-18 13:11 小菜毛毛 閱讀(6115) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
    主站蜘蛛池模板: 四虎影视免费永久在线观看| a毛片成人免费全部播放| 久久久久久亚洲精品| 国产成人啪精品视频免费网| 免费看男女下面日出水来| 男女一边摸一边做爽的免费视频| 亚洲国产成人无码AV在线影院| 亚洲另类精品xxxx人妖| 亚洲国产精品久久久久网站 | 亚洲人成在久久综合网站| 亚洲高清国产拍精品26U| 亚洲国产成人精品久久久国产成人一区二区三区综 | 中文字幕在线免费| 可以免费观看的国产视频| 国产精品福利片免费看| 免费中文字幕视频| 狼人大香伊蕉国产WWW亚洲| 亚洲熟妇av午夜无码不卡| 亚洲日韩国产精品乱-久| 亚洲国产成人综合| 亚洲自偷精品视频自拍| 久久亚洲国产精品成人AV秋霞| 亚洲av日韩av无码黑人| 精品日韩亚洲AV无码| 久久av无码专区亚洲av桃花岛| 亚洲天天做日日做天天欢毛片| 亚洲av丰满熟妇在线播放| 久久青草亚洲AV无码麻豆| 亚洲一级二级三级不卡| 91嫩草私人成人亚洲影院| 亚洲精品中文字幕麻豆| 亚洲国产精品成人综合久久久 | 亚洲精品无码专区在线| 亚洲AV无码成人精品区狼人影院 | 18禁美女黄网站色大片免费观看 | 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲码一区二区三区| 亚洲a视频在线观看| 日本亚洲免费无线码 | 免费黄色福利视频| 国产成人免费高清激情视频|