我有一個用C#.NET 2.0編寫的小型控制檯應用程序。 應用程序查詢數據庫並獲取一定數量的id號碼,然後根據id號碼尋址一個web服務並獲取一些「狀態」。 然後狀態被寫回數據庫。 整個過程中,我保持與數據庫的開放連接,只要應用程序阻止數據庫引擎和其他客戶端無法正常工作,我不確定是否是批處理的最佳方式。 打開和關閉每個操作的連接似乎也不明智。如何維護大量的小查詢
什麼會被視爲處理這些批處理過程的最佳方式?
我有一個用C#.NET 2.0編寫的小型控制檯應用程序。 應用程序查詢數據庫並獲取一定數量的id號碼,然後根據id號碼尋址一個web服務並獲取一些「狀態」。 然後狀態被寫回數據庫。 整個過程中,我保持與數據庫的開放連接,只要應用程序阻止數據庫引擎和其他客戶端無法正常工作,我不確定是否是批處理的最佳方式。 打開和關閉每個操作的連接似乎也不明智。如何維護大量的小查詢
什麼會被視爲處理這些批處理過程的最佳方式?
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
你可以嘗試自己實現批量插入/讀取,但令人驚訝的是,這是NHiberate擅長的地方。我會建議設置它並嘗試,因爲它的工作量相對較少,而且收益可能不可思議。
爲什麼打開和關閉連接不明智?爲什麼你需要保持連接暢通?你不能有一個存儲過程來處理所有的ID更新嗎?我知道SQL Server緩存這樣的查詢,所以你不必擔心那裏的性能。 – manman
因爲我試過在每次更新時打開和關閉連接,每次都有大約20 000次。從您的評論的第二部分我看到,最好的方法是緩衝所有更新,然後將它們一起發送到SP,而不是逐個更新值? – Alexidze
是的,你可以緩衝他們,然後有一個SP來爲你處理更新。 – manman