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)