我必須計算涉及來自多個表的數據的值。我想知道,與將數據讀入數據集(使用簡單的選擇存儲過程)然後循環遍歷記錄相比,使用帶遊標的存儲過程是否會提供性能優勢?數據集不大,它包含6個表格,每個表格包含10個記錄,主要有GUID,幾個nvarchar(100)字段,一個浮點列和一個nvarchar(max)。SQL Server - SQL遊標與ADO.NET
2
A
回答
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
相關問題
- 1. SQL Server 2005遊標
- 2. 遊標在SQL Server
- 3. Oracle遊標與SQL Server光標
- 4. SQL Server中的遊標
- 5. Sql Server的遞歸遊標?
- 6. sql server 2008遊標執行
- 7. jQuery Bootgrid使用ADO.Net與SQL Server 2012
- 8. ADO.NET Command.Prepare和SQL Server 2005
- 9. IF EXISTS在SQL Server遊標不工作
- 10. SQL Server使用遊標查詢xml
- 11. SQL Server嵌套遊標問題
- 12. 執行計數內遊標,sql server
- 13. 從遊標源刪除行SQL Server
- 14. SQL Server查詢性能:嵌套遊標
- 15. 替代sql遊標
- 16. ADO.NET更新SQL Server 2008中的表
- 17. SQL Server的ADO.Net連接字符串
- 18. ADO.NET + Sql Server Varchar編碼問題
- 19. 使用ADO.NET從SQL Server獲取數據
- 20. 通過ADO.NET訪問SQL Server消息
- 21. ADO.NET事務和SQL Server 2008事務
- 22. 從ADO.NET確定SQL Server的版本
- 23. 遊標sql問題
- 24. 遊標SQL查詢
- 25. SQL遊標使用
- 26. SQL遊標問題
- 27. sql遊標的替代品
- 28. SQL遊標與條件在WHERE子句
- 29. Ado.net Sql連接
- 30. SQL語法:SQL Server與Teradata