2014-12-06 44 views
0

我已經寫了一個可以正常工作的腳本,但它非常慢(6小時)。我一直負責創建10000條記錄,每條記錄隨機地(隨機)多達50個enditems,每個記錄隨機地(隨機)最多50個相關的外鍵項目,然後再一次和重複。創建大量的測試數據sql

我覺得這是非常緩慢的,因爲我這樣做的迭代方式。

Loop 10000 
insert into tble1() 
Loop 50 
    insert into tble2 (select top(1) from tble1 desc) 
    Loop 50 
    insert into tble3 (select top(1) from tble2 desc) 
    Loop 50 
    insert into tble4 (select top(1) from tble3 desc) 
    end 
    end 
end 
end 

是怎麼樣的。我知道sql最好與集合而不是迭代,但有沒有辦法做到這一點與沒有這種循環設置我有?

+0

這就是2500萬行,我會讓它在一夜之間運行6個小時,並在第二天使用它。 – 2014-12-06 21:17:39

+1

其實它是12.5億行6小時很不錯 – 2014-12-06 21:18:47

+0

是的,我知道我正在處理大量數據,但方法是否做得太慢?我真的不確定我能做到但除此之外。我對SQL非常陌生,並且正在以一種集思路而不是傳統的迭代過程進行開發。 – Adola 2014-12-06 21:19:12

回答

1

哪個數據庫品牌?

如果你的數據庫支持它,你應該使用批量複製。

如果你不能做到批量複製,嘗試

insert into some_table (columns...) values 
(some values...), 
(some values...), 
... 
(some values...); 

您也可以禁用自動提交,只在最後提交事務。

如果您可以在插入之前刪除/禁用索引,觸發器,約束,鍵,並在之後重新啓用它們,那麼速度也會更快。

您會希望首先插入到外部(引用)表中。

MS SQL服務器:http://msdn.microsoft.com/en-us/library/ms188365.aspx

的PostgreSQL:http://www.postgresql.org/docs/9.3/static/sql-copy.html

甲骨文:https://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm

+0

我正在查看批量插入。除非我正在閱讀錯誤的文檔,否則我必須已經創建了正確的數據?我必須隨機生成所有這些數據。至於你的例子,這就是我目前的做法。但刪除索引可能是一個想法,我還沒有嘗試過。 – Adola 2014-12-06 21:24:56

+0

你的劇本在哪裏?例如,在JDBC + Postgres中,您可以使用CopyManager(內部使用COPY)將數據流發送到數據庫。或者你可以寫入臨時CSV文件 – 2014-12-06 21:26:21

0

我們會盡管我認爲6小時是一個相當短的時間內插1.25十億行,你可以試試以下

Loop 10000 
Insert into table 

    Insert into table (select 50 from temp table where Id like x) 
    Loop 50 
    Insert into table (select 50 from temptable2 where id > something else)