在这种情况下,如何比光标更快地获得“while”?

时间:2011-12-08 14:23:07

标签: sql performance tsql cursor while-loop

目前我需要在SQL Server上多做一些工作,我已经阅读了有关游标以及如何尝试避免它们的原因,因为它们使用了大量资源并且因为它们很慢。

现在我尝试用光标做一些基本的东西,并尝试用while循环重建它。最后,光标比while循环快约10倍,而资源约为60%到40%。

也许是因为我有一个奇怪的例子练习?

这是关于我自己的练习:

  • 遍历一个表,这个表只有一列:“Names”,包含大约1000个名字。
  • 分别打印每个名称。

使用光标非常简单,但对于while循环,我需要一个计数器或其他东西。由于表没有索引,我不能使用它。所以我的解决方案是,我创建了一个临时表,将所有名称添加到表中并包含索引(或行号)。但插入操作大约需要95%的时间,最后while循环比光标慢。

编辑:
我尝试的另一件事是使用WITH Names_Rows AS...并添加Row_Number()作为列,然后使用while循环遍历Names_Rows构造。但这花了更长时间。

我是否错过了在没有索引的情况下使用迭代表格的简单方法?

2 个答案:

答案 0 :(得分:4)

避免游标的原因是因为您一次执行一行命令行而不是基于声明集的操作。

用while循环替换光标本身并不能让性能更好,并且可能会让你的性能变得更糟。两者之间的性能差异取决于您的确切代码/表格结构以及您选择的光标选项as covered in this series of articles

要以更多基于集合的方式打印表格中的所有名称

DECLARE @Names nvarchar(max);

SELECT @Names = ISNULL(@Names + '
','') + Names
FROM YourTable;

PRINT @Names;

答案 1 :(得分:0)

对表中特定列的每个值执行函数的最简单方法是:

select MyFunction(ColumnName) from TableName