簡體   English   中英

如何在Oracle SQL Developer中執行超過100萬個插入查詢?

[英]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 *裝載機場景。

現在,您可以使用SQL Developer來執行此操作。

在此輸入圖像描述

指向分隔的文本文件。

映射所有內容,然后使用此IMPORT方法。 在此輸入圖像描述

完成后,您將擁有一組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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM