![](/img/trans.png)
[英]Oracle 11g : Sql Developer : How to execute more than one anonymous block
[英]How to execute more than 1 million insert queries in Oracle SQL Developer?
我有超過100萬個插入查詢要在Oracle SQL Developer中執行,這需要花費很多時間。 有沒有辦法優化這個。
SQL Developer是運行1,000,000行逐行插入的錯誤工具。
那就是SQL * Plus。
如果你不能編寫程序來使用循環或游標或某些pl / sql批量收集進行插入,那么執行@ marmite-bomber建議的內容 - 將數據寫入平面分隔的文本文件,並設置SQL *裝載機場景。
指向分隔的文本文件。
完成后,您將擁有一組bash或cmd腳本,您需要執行這些腳本。 但首先,您需要在您的計算機上安裝Oracle客戶端 - 這就是sqlldr程序所在的位置。
它比運行1,000,000個單獨插件快幾個數量級。 你的DBA不會恨你。
使用SQLDev向導,您可以在幾分鍾內完成它。
證明:我測試了一個簡單的場景 - 我的發現是( 詳情在這里 ):每秒插入10,753條記錄SQL * Loader 342每秒插入的記錄為SQL Developer
SQL * Loader的速度提高了3,144%。
對於這樣的行數,運行單行INSERT
是不可行的。
因此,一種可能的方法是預處理腳本,僅提取CSV
數據。
這是一個簡單的例子
Insert into TAB(COL1,COL2,COL3) values ('1','xxx',to_date('16-10-2018 15:13:49','DD-MM-YYYY HH24:MI:SS'));
Insert into TAB(COL1,COL2,COL3) values ('2','zzzzz',to_date('06-10-2018 15:13:49','DD-MM-YYYY HH24:MI:SS'));
刪除所有不相關的部分
'1','xxx','16-10-2018 15:13:49'
'2','zzzzz','06-10-2018 15:13:49'
並使用SQL * Loader或外部表加載此文件。 表現會很好。
我有超過100萬個插入查詢要在Oracle SQL Developer中執行
執行任何SQL語句都有開銷。 您正在支付1000000倍的稅。 此外,某些IDE為工作表中執行的每個SQL語句的結果實例化一個單獨的選項卡(一次單擊運行時)。 我不記得SQL Developer是否這樣做了,但如果確實如此,那就是另一項稅收,你需要支付100萬次。
兩種可能的優化。
通過dual
選擇值將單行插入分解為集合操作:
insert into your_table
select blah_seq.nextval, q.txt, q.val from (
select 'WHATEVER' as txt, 42 as val from dual union all
select 'AND SO ON' as txt, 23 as val from dual union all
...
);
這將減少開銷。 這樣做很多編輯工作。
或者,使用批量加載選項(如SQL * Loader或外部表)來加載數據。 如果您的程序員編輯器具有正則表達式支持(如Notepad ++),則刪除insert
語法並將values
子句轉換為CSV行相對簡單。
第三種方法是返回產生百萬插入語句的源代碼,並要求它們以更易管理的格式提供數據,例如數據泵導出。
另一個建議是驗證您在可能的PK列上沒有任何重復。 在插入之前刪除約束並在完成之后將它們放回去。 保持那個改變腳本方便。 您可以將此作為相同腳本或不同腳本的一部分。 再次,如果你不檢查重復,並將PK重新放回期望錯誤; 然后你要追逐帶有重復的行並刪除那些數據。
您可以將數據塊放入集合和批量插入中
此外,刪除主鍵以外的所有索引。 數據加載后創建索引
可能有點危險,但根據數據質量,您還可以刪除外鍵,然后在導入數據后重新創建它們。 您必須確保導入不會破壞FK關系
declare
type my_tab is table of mytable%rowtype index by binary_integer;
a_imp my_tab;
begin
-- do stuff to populate a_imp from presumably a text file? or select statement
-- you could chunk your population of the array and bulk insert say 10,000 rows at a time
-- loop through the holding array and import any remaining data
forall ix in 1 .. a_imp.count
insert into [tabel_name] values a_imp(ix);
commit;
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.