我必须计算一个涉及多个表的数据的值。我想知道,与将数据读取到数据集中(使用简单的select存储过程)然后循环遍历记录相比,使用带有游标的存储过程是否会提供性能优势?数据集并不大,它由6个表组成,每个表大约有10条记录,主要是GUID、几个nvarchar(100)字段、一个浮点列和一个nvarchar(max)。
发布于 2009-04-29 06:19:50
这可能取决于您要检索的数据集(该集越大,在SQL Server中执行的逻辑可能越强,而不是传递它),但我倾向于认为,如果您希望执行计算,请在代码中执行,而不是在存储过程中执行。如果您需要使用游标将数据集中在一起,那就使用游标,但是使用游标进行计算和其他非检索功能,我认为应该避免使用。
编辑:这个指向另一个相关问题的Answer将给游标和循环带来一些利弊。这个答案似乎与我之前关于缩放的断言(参见上文)相冲突。似乎暗示你越大,你可能越想把它移到你的代码中,而不是存储过程中。
发布于 2009-04-29 06:33:02
游标应该更快,但是如果你有很多用户在运行它,它会消耗你的服务器资源。请记住,在使用.Net而不是SQL编写循环时,您可以使用一种功能更强大的编码语言。
在极少数情况下,不能使用基于标准set的SQL替换游标。如果您在服务器上执行此操作,则可以使用基于集合的操作。关于你正在做的事情有更多的细节吗?
如果您决定使用游标,请记住,FAST_FORWARD只读游标将为您提供最佳性能,并确保使用deallocate语句释放它。有关光标提示,请参见here
发布于 2009-04-29 06:56:59
游标的替代方案
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<=@count)
begin
--whatever you need to do
set @i = @i + 1
end
https://stackoverflow.com/questions/802549
复制