夢幻之旅

          DEBUG - 天道酬勤

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

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

          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;

          已創建2行。

          SQL> commit;


          3.在插入時不記錄日志記錄的快速方法
          INSERT的時候可通過APPEND選項不產生歸檔日志。

          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;

          --------------------------------------------------
          一、非歸檔模式下:
          沒有優化前    (1281372  redo size)
          1、單一的使用nologging參數,對redo的產生沒有什么影響。  (1214836  redo size)
          2、單一的使用append提示,redo的減少很顯著              (43872  redo size)
          3、nologging+append,更顯著                             (1108  redo size)

          二、歸檔模式下:
          沒有優化前:            
          1、單獨使用nologging參數,(1231904  redo size)
          2、單獨使用append提示,  (1245804  redo size)
          3、nologging + append,     (3748  redo size)

          a、使用nologging參數并不代表在dml操作中,oracle不產生redo,只是對于指定表的更新數據不產生redo,但是oracle還是要記錄這些操作,所以無論怎么優化,dml操作肯定要產生redo,但是使用這些參數對redo size的影響還是非常可觀的。
          b、單獨使用nologging參數,對redo size沒有多少影響,只有和append配合時,才能產生效果。
          c、單獨使用append提示,對redo的產生影響很大,這是我到現在都不明白的道理,按說append是繞過freelists,直接去尋找新塊,能減少對freelists的爭用,為什么會少這么多redo呢?
          d、歸檔模式和非歸檔模式下,參數影響不一樣,尤其是單獨使用append參數時,看來oracle對歸檔模式下出于安全考慮還是要多一些。 

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

          oracle append有什么作用?

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

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

          2. 假如tab1表中的沒有數據的話 
          DROP   TABLE   TAB1;
          CREATE   TABLE   TAB1   AS   SELECT   *   FROM   TAB2;
          然后在創建索引

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

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

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

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

          插入數據:

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

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

          這里的區別就在于如果插入數據的同時又寫日志,尤其是大數據量的insert操作,需要耗費較長的時間。

          5. 用EXP/IMP 處理大量數據

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

          posted on 2014-04-13 17:32 HUIKK 閱讀(2290) 評論(0)  編輯  收藏 所屬分類: DB-DailyMmaintenance
          主站蜘蛛池模板: 桂东县| 马鞍山市| 大连市| 漳平市| 米易县| 福安市| 涪陵区| 宁都县| 咸丰县| 崇仁县| 安岳县| 晋州市| 怀仁县| 衡东县| 舞钢市| 靖西县| 桐庐县| 额尔古纳市| 砚山县| 阳信县| 绍兴市| 五家渠市| 紫阳县| 扶绥县| 大石桥市| 定襄县| 临澧县| 苏尼特右旗| 历史| 凤山县| 安国市| 长宁县| 棋牌| 绥滨县| 江门市| 乃东县| 满城县| 太原市| 南涧| 澳门| 汝阳县|