SQL Server快进游标

Mil*_*s D 7 sql sql-server stored-procedures

通常认为应尽可能避免在存储过程中使用游标(替换为基于集合的逻辑等).如果您采用需要迭代某些数据的情况,并且可以以只读方式进行,那么快进(只读向前)光标的效率是否比while循环更低或更低?从我的调查来看,它看起来好像光标选项通常更快,并且使用更少的读取和CPU时间.我没有做过任何广泛的测试,但这是其他人发现的吗?这种类型的游标(快进)会带来额外的开销或资源,这些资源可能很昂贵而且我不知道.

所有关于不使用游标的讨论都是关于在基于集合的方法可用时避免使用游标,以及使用可更新游标等.

谢谢

Eri*_*ard 19

虽然快速游标在Sql Server 2005中确实有一些优化,但就性能而言,它们在任何接近基于集合的查询的位置都是正确的.极少数情况下,游标逻辑不能被基于集合的查询替换.游标本身总是较慢,部分原因是你必须不断中断执行以填充你的局部变量.

这里有一些参考文献,如果你研究这个问题,它只会是冰山一角:

http://www.code-magazine.com/Article.aspx?quickid=060113

http://dataeducation.com/re-inventing-the-recursive-cte/


Sim*_*nro -1

SQL Server 中避免使用游标的“最佳实践”可以追溯到 SQL Server 2000 及更早版本。SQL 2005 中引擎的重写解决了与游标问题相关的大多数问题,特别是引入了快进选项。游标并不一定比基于集合的游标差,并且在 Oracle PL/SQL (LOOP) 中得到了广泛且成功的使用。

您提到的“普遍接受的”有效的,但现在已经过时且不正确 - 继续假设快进光标的行为如广告中所宣传和执行的那样。根据 SQL2005 及更高版本的发现进行一些测试和研究

  • 虽然游标确实在 Oracle PL/SQL 中成功使用,但这实际上对它们在 SQL Server 中的使用没有影响。上次我使用 Oracle 时,您无法编写 INSERT ... FROM 或 UPDATE ... FROM 语句,因此您必须使用游标。锁定模型也完全不同,因此我认为比较不公平。 (5认同)
  • 不,西蒙。它既不是“过时的”,也不是“不正确的”。尽管 MS 可能改进了游标的处理方式,并且除了某些管理任务外,游标必然比正确编写的基于集合的代码更糟糕……即使在 Oracle 中也是如此。 (5认同)