2009-04-29 119 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