我在一個檔案中有一個巨大的插入陳述句串列,如下所示,我需要使用存盤程序或 liquibase 腳本在生產資料庫中執行這些陳述句。如果任何記錄插入失敗,那么一切都應該回滾。性能在這里也很重要。
insert into employee (empid, empname, slary) values (1, 'bar', 2000);
insert into employee (empid, empname, slary) values (2, 'foo', 2000);
.
.
insert into employee (empid, empname, slary) values (100000, 'baz', 2000);
uj5u.com熱心網友回復:
提高性能:
- 禁用或洗掉
employees表上的任何索引和約束。您可以在之后重新創建它們。- 注意:如果您的資料未排序,這可能很危險。恢復索引可能需要很長時間。
- 插入時鎖定表
- 批量插入
- 查看用于批量操作的Oracle實用程式
- 請參閱如何將 bcp 實用程式與 oracle dB 或其他實用程式的任何其他更好的選項一起使用
對于回滾,您可以使用ROLLBACK事務
uj5u.com熱心網友回復:
插入件100點的行-AT-一個時間使用UNION ALL特技并用包裹整個代碼BEGIN和END。這比簡單的插入串列更難生成,但批處理操作可以減少逐行開銷,并且通常可以將性能提高 10 倍左右。
begin
insert into employee (empid, empname, slary)
select 1, 'bar', 2000 from dual union all
select 2, 'foo', 2000 from dual union all
...
select 100, 'foobar', 2000 from dual;
...
insert into employee (empid, empname, slary)
...
select 100000, 'baz', 2000 from dual;
end;
/
我使用 100 行,因為如果將所有行批處理到單個INSERTOracle 中,可能需要很長時間來決議龐大的 SQL 陳述句。使用BEGIN和END讓 Oracle 一次通過網路傳遞整個塊,并確保一個陳述句中的單個失敗將回滾其他所有內容。
您不需要直接路徑、/* append */提示、洗掉和重新創建索引、鎖定、SQL 加載程式或任何這些花哨的功能。對于大量資料,這些都是好主意。但是你實際上已經有了一個小資料量,只是一個巨大的陳述句的數量。您需要針對網路延遲和 SQL 決議進行優化 - 加載資料的實際時間可能無關緊要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/330508.html
上一篇:如何獲取一列oraclesql中兩個日期之間的確切年、月、日
下一篇:使用grantupdateuser1.table1創建角色后,我將授予角色給user2,執行更新時收到錯誤ORA-01031
