2011-01-31 51 views
2

我有一個Foo ID的列表。我需要爲每個ID調用一個存儲過程。Parallel.ForEach應該用於數據庫調用嗎?

例如

Guid[] siteIds = ...; // typically contains 100 to 300 elements 
foreach (var id in siteIds) 
{ 
    db.MySproc(id); // Executes some stored procedure. 
} 

每個調用都相當獨立於其他行,這不應該在數據庫中引起爭議。

我的問題:使用Parallel.ForEach並行化它會有好處嗎?或者數據庫IO將成爲一個瓶頸,而更多的線程只會導致更多的爭用?

我會自己測量它,然而,在我的測試環境中測量數據和負載遠遠小於我們真實的Web服務器時,很難測量它。

+0

我會建議你測量兩種方法的表現,並選擇更快的方法。 – 2011-01-31 19:43:17

回答

2

出於好奇,爲什麼你要與Parallel.ForEach租期,提高它和生成線程/打開的連接/數據傳遞/獲取響應爲每個項目,而不是寫一個簡單的「存儲過程」,將與合作ID列表而不是單個ID?

從第一眼看,它應該讓你有更多更明顯的改善。

+0

答案:很複雜。我正在研究一箇舊系統,我的手是那種關係。另外,它並不像看起來那麼明確;我實際上調用了一個.NET方法,它會做一些廢話,然後再廢話一點,然後調用一個存儲過程。從這個舊系統中剔除這將是危險的。 – 2011-01-31 19:53:46

1

我認爲Parallel.ForEach可以工作,假設你的數據庫服務器可以處理約150-300個併發操作。

確切知道的唯一方法就是測量兩者。

+0

我確定SQL可以處理大量併發任務,給定連接池和所有這些,但是我不確定的部分是結果IO爭用是否會被取消。 – 2011-01-31 19:57:27