2012-10-17 95 views
0

我正在尋找一種將記錄插入到SQL Server中以便爲我的C#/ MVC應用程序使用的有效方法。任何人都知道最好的方法是什麼?高效的插入語句

通常我剛剛完成了一個while循環並在其中插入了語句,但是之後我還沒有處理太多的記錄。我需要插入大約50萬,每分鐘300行,while循環,我會整天在這裏!

我在做什麼循環通過一個大的保存表,並使用它的行來創建不同的表中的記錄。我已經爲新表格設置了查找數據所需的一些函數,這無疑增加了搜索的空間。

所以這裏是我有的查詢。對於大量數據極其低效!

Declare @HoldingID int 
Set @HoldingID = (Select min(HoldingID) From HoldingTable) 

While @JourneyHoldingID IS NOT NULL 
Begin 
    Insert Into Journeys (DepartureID, ArrivalID, ProviderID, JourneyNumber, Active) 
    Select 
     dbo.GetHubIDFromName(StartHubName), 
     dbo.GetHubIDFromName(EndHubName), 
     dbo.GetBusIDFromName(CompanyName), 
     JourneyNo, 1 
    From Holding 
    Where HoldingID = @HoldingID 

    Set @HoldingID = (Select MIN(HoldingID) From Holding Where HoldingID > @HoldingID) 
End 

我聽說過基於集合的方法 - 有任何可能對上述問題的工作嗎?

+0

看到我的答案[here](http:// stackoverflow。/ 12729250/grouping-data-in-sql-server-for-particular-patterns/12730333#12730333) –

回答

3

這應該是你現在正在做的。

Insert Into Journeys(DepartureID, ArrivalID, ProviderID, JourneyNumber, Active) 
Select 
    dbo.GetHubIDFromName(StartHubName), 
    dbo.GetHubIDFromName(EndHubName), 
    dbo.GetBusIDFromName(CompanyName), 
    JourneyNo, 1 
From Holding 
ORDER BY HoldingID ASC 
+0

談論讓事情變得複雜。這種簡單的解決方案 - 在不到5分鐘內插入50萬行。非常感謝 –

5

如果要插入大量的數據到MSSQL服務器,那麼你應該使用BULK INSERTs - 有一個命令行工具,稱爲bcp utility對於這一點,也是一個C#包裝進行Bulk Copy Operations,但在幕後,他們是全部使用BULK INSERT

根據您的應用程序,您可能需要先將數據插入臨時表中,然後再將MERGEINSERT INTO SELECT...將這些行從臨時表傳輸到目標表 - 如果您有很多數據,那麼這將需要一些時間,但是比單獨執行插入更快將會是lot

如果你想加快速度,那麼是various things that you can do,如更改恢復模型或調整/刪除觸發器和索引(取決於它是否是活動數據庫)。如果它仍然非常慢,那麼你應該考慮分批執行這個過程(例如,一次1000行)。

+0

是的,我使用批量插入來首先獲取數據到保存表中。如果您需要在每一行上做一些工作,即使用查找函數來獲取正確的ID,您是否可以真正使用它? –

+0

@ e-on ['MERGE'](http://technet.microsoft.com/zh-cn/library/bb510625.aspx)語句是否有幫助?我不得不承認我以前從未使用過它 - 只是發現它正在研究這個問題。我會確保在執行合併之前暫存表中的信息是最新的,以便儘量減少您執行的函數調用次數。 – Justin

+0

它看起來可能有用 - 需要做一些閱讀。 –

1

你(可能)都能夠做到這一點的形式

INSERT INTO JOURNEYS 
SELECT * FROM HOLDING; 

的一個聲明中沒有關於你的架構的詳細信息,很難有絕對的把握。

0

SQLServer 2008引入了表參數。這些允許您在單次訪問數據庫時插入多行(將其作爲大塊發送)。不使用臨時表。本文介紹了它的工作原理(第四步在文章中)

http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/

它不同於批量插入在你不需要特殊工具,並且所有的約束和外鍵進行檢查。

我使用這種方法將吞吐量提高了四倍,並且使插入操作並行化。現在在同一張表中以15.000次插入/秒持續。定期表與索引和超過10億行。