2009-10-15 99 views
1

編輯︰我運行SQL Server 2008如何在SQL中快速複製行

我在我的表中有大約400,000行。我想複製這些行,直到我的表有1.6億行左右。我一直在使用這樣的語句:

INSERT INTO [DB].[dbo].[Sales] 
      ([TotalCost] 
      ,[SalesAmount] 
      ,[ETLLoadID] 
      ,[LoadDate] 
      ,[UpdateDate]) 
SELECT [TotalCost] 
     ,[SalesAmount] 
     ,[ETLLoadID] 
     ,[LoadDate] 
     ,[UpdateDate] 
    FROM [DB].[dbo].[Sales] 

這個過程很慢。我必須重新發出查詢一些次數是否有更好的方法來做到這一點?

回答

3

要你將要禁用所有的索引和約束(包括外鍵),然後運行一系列的這許多刀片:

INSERT INTO mytable 
SELECT fields FROM mytable 

如果需要指定ID,挑選一些數字,如8000萬和包括在SELECT列表中ID+80000000。根據需要多次運行(不超過10次,因爲每次都應該加倍)。

另外,不在交易內運行。在這麼龐大的數據集上這樣做的開銷會很大。無論如何,你可能會用盡資源(回滾段或任何數據庫使用)。

然後重新啓用所有約束和索引。這將需要很長的時間但總體來說,它會比在每行上添加索引和檢查約束更快。

0

您沒有聲明您的SQL數據庫,但大多數都有批量加載工具來處理這種情況。檢查文檔。如果必須使用INSERT執行此操作,請首先從表中刪除所有索引,並在數據被INSERT後重新應用它們;這通常比插入過程中的索引快得多。

1

因爲每次你運行該命令將您的表的大小,你只需要運行約9倍(400,000 * 2 = 204800000)。是的,這可能需要一段時間,因爲複製這麼多的數據需要一些時間。

1

插入的速度取決於許多事情......物理磁盤速度,索引等。我建議從表中刪除所有索引,並在完成時將其添加回去。如果表格索引嚴重,那麼這應該會有所幫助。

您應該能夠在循環中反覆運行該查詢,直到達到所需的行數。每次你運行它,你會加倍的數據,所以你會最終:

400,000 
800,000 
1,600,000 
3,200,000 
6,400,000 
12,800,000 
25,600,000 
51,200,000 
102,400,000 
204,800,000 

經過九個處決。

+0

沒錯。問題在於它只需要10分鐘就能完成前幾次的測試。我對時間進行成像會按比例進行比例縮放,所以真的需要幾個小時才能複製一個這樣大小的表格? – abudker 2009-10-15 00:51:06

+0

您是否嘗試刪除索引?在某個時候,它會*花費那麼長的時間來寫出那麼多的數據。 – 2009-10-15 01:37:43

0

這可能還需要一段時間才能運行...您可能想要在創建數據時關閉日誌記錄。

INSERT INTO [DB].[dbo].[Sales] (
      [TotalCost] ,[SalesAmount] ,[ETLLoadID] 
      ,[LoadDate] ,[UpdateDate] 
) 
SELECT s.[TotalCost] ,s.[SalesAmount] ,s.[ETLLoadID] 
     ,s.[LoadDate] ,s.[UpdateDate] 
FROM [DB].[dbo].[Sales] s (NOLOCK) 
CROSS JOIN (SELECT TOP 400 totalcost FROM [DB].[dbo].[Sales] (NOLOCK)) o 
+0

該命令行是做什麼的? – abudker 2009-10-15 00:53:03

+0

我用它作爲笛卡兒加入http://en.wikipedia.org/wiki/Cartesian_product基本上,它將以銷售中的記錄數量的400倍結束。我說前400名400 * 400,000爲160萬。 – 2009-10-15 02:12:39

+0

最簡單和最乾淨的方法就是像其他人所建議的那樣將輸入量加倍。 – 2009-10-15 02:13:36