Oracle快速插入數據append


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM