1、采用insert into values 語句插入一條,寫很多條語句即可多條數(shù)據(jù),這種主要針對于離散值以及一些基礎(chǔ)信息的錄入,如:insert into test(xh,mc) values('123','測試');
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計制作、成都網(wǎng)站制作和溫江服務(wù)器租用的網(wǎng)絡(luò)公司,有著豐富的建站經(jīng)驗(yàn)和案例。
如果插入的數(shù)據(jù)有規(guī)律,可利用for、loop循環(huán)插入,主要用于批量生成測試數(shù)據(jù)
begin
for i in 1 .. 100 loop
insert into test(xh,mc) values(i||'','測試');
end loop;
end ;。
2、采用insert into selct from 語句來一次性插入一個集合,這種主要依據(jù)于要插入的數(shù)據(jù)源已經(jīng)存儲于數(shù)據(jù)庫對象中,或者利用dual虛表來構(gòu)造數(shù)據(jù),經(jīng)過加工后寫入一個集合。
insert into test (xh,mx) select '123','測試' from dual;
3、采用plsql等工具、或者oracle的imp、impdp命令來導(dǎo)入,這種主要用數(shù)據(jù)庫與數(shù)據(jù)庫之間的大批量數(shù)據(jù)導(dǎo)入,導(dǎo)入的數(shù)據(jù)格式為plsql的pde、oracle的dmp等。dmp文件可使用
table_exists_action參數(shù)控制導(dǎo)入動作:replace替換原表,truncate清除原表數(shù)據(jù)再導(dǎo)入,append增量導(dǎo)入數(shù)據(jù),當(dāng)然impdp數(shù)據(jù)泵的導(dǎo)入要依賴于directory路徑。
impdp 用戶名/密碼 dumpfile=123.dmp logfile=123.log directory=imp_dir tables=test table_exists_action=append
4、使用excel文件直接拷貝。這種主要用于要寫入的數(shù)據(jù)已是excel文件或者行列分明的其它格式文件,每一列的值和表結(jié)構(gòu)相對應(yīng),可直接打開表的行級鎖,把數(shù)據(jù)拷貝進(jìn)入。
打開行級鎖方法:
select t.*,rowid from 表名 t where 1=2;
select * from ?表名 ?where 1=2 for update;
直接把excel數(shù)據(jù)拷貝到表里
后臺用servlet或者action都可以接受到前臺頁面?zhèn)鬟^來的數(shù)據(jù)。只要你在后臺寫了連接數(shù)據(jù)庫的方法,并且寫了入庫的方法,如save方法,就可以放入數(shù)據(jù)庫中了。至于連接數(shù)據(jù)庫的代碼,網(wǎng)上一大堆。
如果數(shù)據(jù)庫中字段也是Date類型,那么就不用轉(zhuǎn)換了,如果是varchar2,java可以用
new SimpleDateFormat()來處理,百度搜索下就可以了。
前提:在做insert數(shù)據(jù)之前,如果是非生產(chǎn)環(huán)境,請將表的索引和約束去掉,待insert完成后再建索引和約束。
insert into tab1 select * from tab2; commit;
這是最基礎(chǔ)的insert語句,我們把tab2表中的數(shù)據(jù)insert到tab1表中。根據(jù)經(jīng)驗(yàn),千萬級的數(shù)據(jù)可在1小時內(nèi)完成。但是該方法產(chǎn)生的arch會非常快,需要關(guān)注歸檔的產(chǎn)生量,及時啟動備份軟件,避免arch目錄撐爆。
alter table tab1 nologging;
insert /*+ append */ into tab1 select * from tab2;
commit; alter table tab1 logging;
該方法會使得產(chǎn)生arch大大減少,并且在一定程度上提高時間,根據(jù)經(jīng)驗(yàn),千萬級的數(shù)據(jù)可在45分鐘內(nèi)完成。但是請注意,該方法適合單進(jìn)程的串行方式,如果當(dāng)有多個進(jìn)程同時運(yùn)行時,后發(fā)起的進(jìn)程會有enqueue的等待。注意此方法千萬不能dataguard上用,不過要是在database已經(jīng)force logging那也是沒有問題的。
insert into tab1 select /*+ parallel */ * from tab2; commit;
對于select之后的語句是全表掃描的情況,我們可以加parallel的hint來提高其并發(fā),這里需要注意的是最大并發(fā)度受到初始化參數(shù)parallel_max_servers的限制,并發(fā)的進(jìn)程可以通過v$px_session查看,或者ps -ef |grep ora_p查看。
alter session enable parallel dml;
insert /*+ parallel */ into tab1 select * from tab2; commit;
其他方法:
并發(fā)的insert,尚未比較和方法2哪個效率更高(偶估計是方法2快),有測試過的朋友歡迎補(bǔ)充。
insert into tab1 select * from tab2 partition (p1);
insert into tab1 select * from tab2 partition (p2);
insert into tab1 select * from tab2 partition (p3);
insert into tab1 select * from tab2 partition (p4);
對于分區(qū)表可以利用tab1進(jìn)行多個進(jìn)程的并發(fā)insert,分區(qū)越多,可以啟動的進(jìn)程越多。我曾經(jīng)試過insert 2.6億行記錄的一個表,8個分區(qū),8個進(jìn)程,如果用方法2,單個進(jìn)程完成可能要40分鐘,但是由于是有8個分區(qū)8個進(jìn)程,后發(fā)進(jìn)程有enqueue,所以因此需要的時間為40分鐘×8;但是如果用方法5,雖然單個進(jìn)程需要110分鐘,但是由于能夠并發(fā)進(jìn)程執(zhí)行,所以總共需要的時間就約為110分鐘了。
DECLARE TYPE dtarray IS TABLE OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
v_col1 dtarray; v_col2 dtarray; v_col3 dtarray;
BEGIN SELECT col1, col2, col3 BULK COLLECT INTO v_col1, v_col2, v_col3
FROM tab2;
FORALL i IN 1 .. v_col1.COUNT insert into tab1
WHERE tab1.col1 = v_col1;
END;
用批量綁定(bulk binding)的方式。當(dāng)循環(huán)執(zhí)行一個綁定變量的sql語句時候,在PL/SQL 和SQL引擎(engines)中,會發(fā)生大量的上下文切換(context switches)。使用bulk binding,能將數(shù)據(jù)批量的從plsql引擎?zhèn)鞯絪ql引擎,從而減少上下文切換過程,提升效率。該方法比較適合于在線處理,不必停機(jī)。
sqlplus -s user/pwd runlog.txt set copycommit 2;
set arraysize 5000;
copy from user/pwd@sid - to user/pwd@sid - insert tab1 using
select * from tab2; exit EOF
用copy的方法進(jìn)行插入,注意此處insert沒有into關(guān)鍵字。該方法的好處是可以設(shè)置copycommit和arrarysize來一起控制commit的頻率,上面的方法是每10000行commit一次。
需要用insert into ... select... where 語句來執(zhí)行:
如原表中有如下數(shù)據(jù):
emp表中有如下數(shù)據(jù),其中要將empno為7369的empno和ename插入到test表中。
可以用如下語句:
1
2
insert into test (id,name) select empno,ename from emp where empno=7369;
commit;
結(jié)果如下,其中紅框部分為新加的數(shù)據(jù):
Oracle不支持也沒有SqlBulkCopy類,那個只有SqlServer數(shù)據(jù)庫才支持,Oracle可以用數(shù)組形式的參數(shù)批量提交來實(shí)現(xiàn),但那個絕對不能叫“BulkCopy”。
OracleCommand command = new OracleCommand("鏈接字符串");
command.ArrayBindCount = 1000;
command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";
int[] deptNo = new int[1000];
string[] dname = new string[1000];
string[] loc = new string[1000];
command.Parameters.Add(new OracleParameter("deptno", OracleDbType.Int32) { Value = deptNo });
command.Parameters.Add(new OracleParameter("dname", OracleDbType.Varchar2) { Value = dname });
command.Parameters.Add(new OracleParameter("loc", OracleDbType.Varchar2) { Value = loc });
command.ExecuteNonQuery();
網(wǎng)頁標(biāo)題:oracle如何寫入數(shù)據(jù) oracle寫入數(shù)據(jù)IO性能
標(biāo)題來源:http://m.newbst.com/article16/hihjgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設(shè)計、電子商務(wù)、建站公司、虛擬主機(jī)、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)