2

我必须计算一个涉及来自多个表的数据的值。我想知道与将数据读入数据集(使用简单的选择存储过程)然后循环遍历记录相比,使用带有游标的存储过程是否会提供性能优势?数据集并不大,它由 6 个表组成,每个表大约有 10 条记录,主要是 GUID、几个 nvarchar(100) 字段、一个浮点列和一个 nvarchar(max)。

4

4 回答 4

2

这可能取决于您可能要检索的数据集(集合越大,在 SQL Server 内部执行而不是传递它可能越合乎逻辑),但我倾向于认为,如果您要执行计算,在您的代码中执行此操作,并远离您的存储过程。如果您需要使用游标将数据拉到一起,就这样吧,但我认为应该避免使用它们进行计算和其他非检索功能。

编辑:这个对另一个相关问题的回答会给游标与循环带来一些利弊。这个答案似乎与我之前关于缩放的断言(见上文)相冲突。似乎表明你得到的越大,你可能越想将它移到你的代码而不是存储过程中。

于 2009-04-29T14:19:49.720 回答
1

游标应该更快,但如果你有很多用户运行它,它会消耗你的服务器资源。请记住,在 .Net 而不是 SQL 中编写循环时,您拥有更强大的编码语言。

很少有游标无法使用基于标准集的 SQL 替换的情况。如果您在服务器上执行此操作,则可以使用基于集合的操作。关于你在做什么的更多细节?

如果您决定使用游标,请记住 FAST_FORWARD 只读游标将为您提供最佳性能,并确保您使用 deallocate 语句来释放它。有关光标提示,请参见此处

于 2009-04-29T14:33:01.780 回答
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<=@count)
begin


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

end
于 2009-04-29T14:56:59.210 回答
0

游标应该更快(除非您在 SQL 而不是在 ADO.NET 中做一些奇怪的事情)。

也就是说,我经常发现游标可以通过一点点跑腿来消除。你需要做什么手续?

干杯,
埃里克

于 2009-04-29T14:18:39.223 回答