1:用merge into 進行匹配更新和插入,2: 開啟并行,提高速度3: 如果可以的話加NOLOGING 不寫入日志4:如果數據有規律的話,分批次執行
1.使用marge快速插入;
MERGE /*+ append */ INTO A dUSING (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 ...nologingselect * from ...
insert /*+ append, parallel */ into ods_list_t nologgingselect * from ods_list;
但這樣不行:整個表可以插入,但要某一個字段則不能加入nologginginsert /*+ append, parallel */ into ods_list_t(a,b) nologgingselect 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 20set copycommit 5000copy from username/passWord@oracle_name append table_name1using 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)
新聞熱點
疑難解答