2012-11-26 49 views
0

我有一個用C#.NET 2.0編寫的小型控制檯應用程序。 應用程序查詢數據庫並獲取一定數量的id號碼,然後根據id號碼尋址一個web服務並獲取一些「狀態」。 然後狀態被寫回數據庫。 整個過程中,我保持與數據庫的開放連接,只要應用程序阻止數據庫引擎和其他客戶端無法正常工作,我不確定是否是批處理的最佳方式。 打開和關閉每個操作的連接似乎也不明智。如何維護大量的小查詢

什麼會被視爲處理這些批處理過程的最佳方式?

+0

爲什麼打開和關閉連接不明智?爲什麼你需要保持連接暢通?你不能有一個存儲過程來處理所有的ID更新嗎?我知道SQL Server緩存這樣的查詢,所以你不必擔心那裏的性能。 – manman

+0

因爲我試過在每次更新時打開和關閉連接,每次都有大約20 000次。從您的評論的第二部分我看到,最好的方法是緩衝所有更新,然後將它們一起發送到SP,而不是逐個更新值? – Alexidze

+1

是的,你可以緩衝他們,然後有一個SP來爲你處理更新。 – manman

回答

1

If you have loads of ids and want to update them all in a one go (a batch),可以形成兩個CSV字符串並將它們作爲參數傳遞給存儲過程(sp)。

此外,您還需要一個功能將sp中的這些CSV拆分(Here are a few),然後更新您的表。例如:

Ex;

//Make sure you have a relation between id and statusid here. i.e. same index 
string csvIds = "101,2234,349,..."; //CSV for ids 
string csvStatusIds = ="1,2,3,..."; //CSV for statusIds 

//Pass above csv lists to the following stored procedure... 

//Create a stored procedure to pass above ids.  
CREATE PROCEDURE [dbo].[updateStatuses] 

    @Ids VARCHAR(Max), 
    @StatusIds VARCHAR(Max) 

AS 
BEGIN 
    DECLARE @tblIds TABLE (key1 INT IDENTITY(1,1), myId INT) 
    DECLARE @tblStatusIds TABLE (key2 INT IDENTITY(1,1), myStatusId INT) 

    INSERT INTO @tblIds 
     SELECT ITEMS FROM dbo.Split(@Ids,',') 
    INSERT INTO @tblStatusIds 
     SELECT ITEMS FROM dbo.Split(@StatusIds,',') 

    --//Do your status update here 
    UPDATE yt.statusId = s.myStatusId 
    FROM [YourTable] yt JOIN @tblIds i 
       ON yt.id = i.myId JOIN @tblStatusIds s 
       ON i.key1 = s.key2 

END 
+0

謝謝你的詳細回覆。有一些額外的數據,而不僅僅是Id,就像評論字符串等,你是否也看到這種解決方案在這種情況下最佳? – Alexidze

+1

是的,**在傳遞註釋爲CSV時需要小心,因爲可能會有','(逗號),這會打破分割功能。在這種情況下,您可以使用不同的分隔符(例如|或〜')。 – Kaf

0

你可以嘗試自己實現批量插入/讀取,但令人驚訝的是,這是NHiberate擅長的地方。我會建議設置它並嘗試,因爲它的工作量相對較少,而且收益可能不可思議。