2009-02-04 56 views
4

我有一個關於SQL性能的問題。我將用僞代碼說明我的問題。SQL性能問題

我想知道哪種瓶坯可以更好地製造出多少?說10個項目,每頁加載。在.NET中。速度快了嗎?快一點? SQL上的差異不明顯?

foreach(item in mylist) { 
CallSQLStoredProc(item.id); 
} 

VS

int[] ids; // array of ids 
CallSQLStoredProc(ids) // stored procedure returns more than one row for each id 

回答

11

第二個選項肯定會更快,因爲它是一個單一的網絡往返,以及單一的SP調用。

0

在每個頁面加載時,還是第一次加載頁面?我不想爲ASP.NET頁面中的每個回發做這件事。

要更直接地回答您的問題,如果您能夠通過發送多個ID獲取多條記錄,請執行此操作。如果您需要超過10個項目,則效率更高,可擴展性更高。

0

這一切取決於PROC是如何編碼的,如果你在10個項目通過在第二PROC和PROC然後使用遊標讓那些行,那麼第一次調用可能會更快

2

Definetly第二,不同的從大約10倍快一點到快一點。

如果你正在使用ID做的事情可以在一個集合操作中完成,你將獲得比單獨調用SP好幾倍的性能增益。

我經常有特效看起來像:

create procedure proc (@ids varchar(max)) as 
select * from users_tbl u 
inner join spiltCSVs(@ids) c 
    on c.id = u.id 
--so on and so forth 

這是一套基於操作;而不是在proc中使用遊標的過程方法,或者使用for循環遍歷調用具有單個id的過程。

+0

你使用哪個db? 我正在SQL Server中尋找這個函數「spiltCSVs」。 谷歌「spiltCSVs」返回我1結果:-) – 2009-03-24 03:46:05

+0

這是一個實用功能,每個人都根據需要自行編寫。 http://stackoverflow.com/questions/314824/t-sql-opposite-to-string-concatenation-how-to-split-string-into-multiple-recor – 2009-03-24 13:21:29

1

因爲這將不適合在ocdecio的回答評論...

只是爲了擴大它...在我所見過的網絡流量大部分系統是性能的限制因素(假設一個合理調整的數據庫和前端代碼,並不是絕對可怕的)。即使您的Web服務器和數據庫服務器位於同一臺計算機上,如果您在這兩者之間頻繁來回呼叫,則進程間通信也可能是一個限制因素。

0

第二個要快多少取決於太多的東西。與結果集的大小相比,網絡開銷可能是微不足道的。

還有另一種選擇(它應該比鎖定行爲更快),即call all of them asynchronously - 那麼當最長的頁面完成時,您的頁面可以有效地完成。顯然,這將需要一些額外的編碼。

在這個例子中,只有一個SP開銷。我們假設該SP返回單個行集客戶端將拆分/過程或多個行集:

int[] ids; // array of ids 
CallSQLStoredProc(ids) // stored procedure returns more than one row for each id 

在這個例子中,SP調用開銷N次單呼。和調用序列:

foreach(item in mylist) { 
    CallSQLStoredProc(item.id); 
} 

在第三種方式:

foreach(item in mylist) { 
    StartSQLStoredProc(item.id); 
} 

// Continue building the page until you reach a point where you absolutely have to have the data 

wait(); 

這仍然具有n個DB調用的開銷,但性能的提升可以依賴於SQL服務器和網絡的能力爲了平行工作量。此外,您還可以在頁面構建時啓動SQL Server的工作。

單個SP解決方案仍然可以勝出,特別是如果它可以用UNION組裝SQL Server可以並行化任務的單個結果集。但是,如果結果集具有單獨的模式或者UNION不能很好地執行,多個SP異步解決方案可以將其打敗(並且還可以利用在頁面中執行其他工作的能力)。

0

迭代任何事情總是會導致更多的開銷。迭代改善性能的情況並不多。

我的建議一向以避免編程兩兩件事:

  1. 如果然後其他statments
  2. 迭代

你將永遠在那裏你會使用這兩種情況下,但少您使用它們時,您的應用程序運行得越快,越順利。

0

如果您希望在您的應用程序中具有可伸縮性,您將盡可能使用緩存。您應該只運行一次共享查詢並將結果存儲在緩存中。

至於你的查詢,假設你沒有在每個ID的查詢中使用遊標,只要網絡延遲對你的操作產生了有意義的影響,它應該更快。如有疑問,請測量。當我實際上對我的功能進行計時以瞭解不同的事情需要多長時間時,我感到非常驚訝。

在.net System.Diagnostics.StopWatch是你的朋友:)。