2009-04-29 115 views
2

我必須計算涉及來自多個表的數據的值。我想知道,與將數據讀入數據集(使用簡單的選擇存儲過程)然後循環遍歷記錄相比,使用帶遊標的存儲過程是否會提供性能優勢?數據集不大,它包含6個表格,每個表格包含10個記錄,主要有GUID,幾個nvarchar(100)字段,一個浮點列和一個nvarchar(max)。SQL Server - SQL遊標與ADO.NET

回答

2

這將可能取決於你可能會被檢索回的數據集(在設定較大,比較合乎邏輯的,可能是在SQL Server內部圍繞它傳遞的,而不是執行),但我傾向於認爲,如果您正在尋找執行計算,請在代碼中執行並遠離存儲過程。如果您需要使用遊標將數據集中在一起,那就這樣做吧,但是使用它們來執行計算和其他非檢索功能我認爲應該避開。

編輯:這Answer到另一個相關的問題會給遊標與循環的一些優點和缺點。這個答案似乎與我之前關於縮放的說法(請參閱上文)有衝突。似乎表明,你得到的越大,你可能想把它移到你的代碼中,而不是在存儲過程中。

0

遊標應該更快(除非你在SQL中而不是在ADO.NET中做奇怪的事情)。

這就是說,我經常發現遊標可以通過一點運動來消除。你需要做什麼程序?

乾杯,
埃裏克

1

遊標應該更快,但如果你有很多用戶運行它,它會吃掉你的服務器資源。請記住,使用.Net而不是SQL編寫循環時,您擁有更強大的編碼語言。

有很少情況下,使用基於標準集的SQL無法替換遊標。如果您在服務器上執行此操作,則可以使用基於集合的操作。關於你在做什麼的更多細節?

如果您決定使用遊標,請牢記FAST_FORWARD只讀遊標將爲您提供最佳性能,並確保使用釋放語句釋放它。見here的光標提示

1

替代光標

declare @table table (Fields int) 
declare @count int 
declare @i 

insert inot @table (Fields) 
select Fields 
from Table 


select @count = count(*) from @table 

while (@i<[email protected]) 
begin 


--whatever you need to do 
set @i = @i + 1 

end