夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

          1:用merge into 進(jìn)行匹配更新和插入,
          2: 開啟并行,提高速度
          3: 如果可以的話加NOLOGING 不寫入日志
          4:如果數(shù)據(jù)有規(guī)律的話,分批次執(zhí)行

          1.使用marge快速插入;

          MERGE /*+ append */
             INTO A d
          USING (select * B where ...) f
              ON (d.account_no = f.account_no)
          WHEN MATCHED THEN
              update set acc_date = f.acc_date,...
          WHEN NOT MATCHED THEN
              insert values ( f.account_no,f.acc_date..)
          /
          commit;


          2.向表中插入兩條記錄

          SQL> INSERT ALL
            2     INTO toms values(1)
            3     into toms values(2)
            4     select * from dual;

          已創(chuàng)建2行。

          SQL> commit;


          3.在插入時不記錄日志記錄的快速方法
          INSERT的時候可通過APPEND選項(xiàng)不產(chǎn)生歸檔日志。

          alter table aa nologging

          alter table aa logging

          insert /*+append*/ into ...nologing
          select * from ...

          insert /*+ append, parallel */ into ods_list_t nologging
          select * from ods_list;

          但這樣不行:整個表可以插入,但要某一個字段則不能加入nologging
          insert /*+ append, parallel */ into ods_list_t(a,b) nologging
          select a,b from ods_list;

          但可以這樣:
          insert /*+ append, parallel */ into ods_list_t  nologging(a,b)
          select a,b from ods_list;

          create table ods_list_t nologging as select * from ods_list;

          insert /*+ append, parallel */ into ods_list_t nologging 
          select * from ods_list;


          insert /*+ Append parallel(tablename,number) */ into ods_list_t nologging 
          select * from ods_list;

          tablename: 表名
          number: 并行度

          4、
          使用批量拷貝方法
          set arraysize 20
          set copycommit 5000
          copy from username/password@oracle_name append table_name1 
          using select * from table_name2;

          --------------------------------------------------
          一、非歸檔模式下:
          沒有優(yōu)化前    (1281372  redo size)
          1、單一的使用nologging參數(shù),對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,只是對于指定表的更新數(shù)據(jù)不產(chǎn)生redo,但是oracle還是要記錄這些操作,所以無論怎么優(yōu)化,dml操作肯定要產(chǎn)生redo,但是使用這些參數(shù)對redo size的影響還是非??捎^的。
          b、單獨(dú)使用nologging參數(shù),對redo size沒有多少影響,只有和append配合時,才能產(chǎn)生效果。
          c、單獨(dú)使用append提示,對redo的產(chǎn)生影響很大,這是我到現(xiàn)在都不明白的道理,按說append是繞過freelists,直接去尋找新塊,能減少對freelists的爭用,為什么會少這么多redo呢?
          d、歸檔模式和非歸檔模式下,參數(shù)影響不一樣,尤其是單獨(dú)使用append參數(shù)時,看來oracle對歸檔模式下出于安全考慮還是要多一些。 

          ---------------------------------------------------------------------------------

          oracle append有什么作用?

          請教一下,oracle中append是做什么用的。
            insert /*+append*/ into table1 select * from table2
          在使用了append選項(xiàng)以后,insert數(shù)據(jù)會直接加到表的最后面,而不會在表的空閑塊中插入數(shù)據(jù)。
          使用append會增加數(shù)據(jù)插入的速度。
          /*+APPEND*/的作用是在表的高水位上分配空間,不再使用表的extent中的空余空間
          append 屬于direct insert,歸檔模式下append+table nologging會大量減少日志,非歸檔模式append會大量減少日志,append方式插入只會產(chǎn)生很少的undo
          不去尋找 freelist 中的free block , 直接在table HWM 上面加入數(shù)據(jù)。

          1. 采用高速的存儲設(shè)備,提高讀寫能力,如:EMC 和NetApp,

          2. 假如tab1表中的沒有數(shù)據(jù)的話 
          DROP   TABLE   TAB1;
          CREATE   TABLE   TAB1   AS   SELECT   *   FROM   TAB2;
          然后在創(chuàng)建索引

          3. 用Hint 提示減少操作時間

              INSERT   /*+Append*/   INTO     tab1 
                          SELECT   *   FROM   tab2;

          4. 采用不寫日志及使用Hint提示減少數(shù)據(jù)操作的時間。

          建議方案是先修改表為不寫日志: 
          sql> alter   table   table_name   NOLOGGING;

          插入數(shù)據(jù):

          INSERT   /*+Append*/   INTO     tab1 
                SELECT   *   FROM   tab2;

          插入完數(shù)據(jù)后,再修改表寫日志: 
          sql> alter   table   table_name   LOGGING;

          這里的區(qū)別就在于如果插入數(shù)據(jù)的同時又寫日志,尤其是大數(shù)據(jù)量的insert操作,需要耗費(fèi)較長的時間。

          5. 用EXP/IMP 處理大量數(shù)據(jù)

          (1)給當(dāng)前的兩個表分別改名 
          alter   table   tab1   rename   to   tab11; 
          alter   table   tab2   rename   to   tab1; 
          (2)導(dǎo)出改名前的tab2 
          exp   user/pwd@...   file=...   log=...   tables=(tab1) 
          (3)把名字改回來 
          alter   table   tab1   rename   to   tab2; 
          alter   table   tab11   rename   to   tab1; 
          (4)導(dǎo)入數(shù)據(jù) 
          imp   user/pwd@...   file=...   log=...   fromuser=user   touser=user   tables=(tab1)

          posted on 2014-04-13 17:32 HUIKK 閱讀(2290) 評論(0)  編輯  收藏 所屬分類: DB-DailyMmaintenance
          主站蜘蛛池模板: 海盐县| 巩义市| 博爱县| 盐城市| 澄迈县| 鹰潭市| 蓝田县| 德兴市| 明星| 京山县| 靖安县| 基隆市| 莒南县| 河西区| 汕尾市| 乃东县| 三原县| 太原市| 沁源县| 昌平区| 宁城县| 西青区| 安平县| 镇原县| 吉隆县| 敦煌市| 大理市| 洪雅县| 新建县| 连城县| 保亭| 新宁县| 孙吴县| 安顺市| 南京市| 澎湖县| 肇庆市| 元谋县| 磴口县| 宁武县| 兴化市|