SQL,While循环,递归存储过程或游标中哪个更快?

时间:2010-06-11 13:10:13

标签: sql-server performance stored-procedures while-loop cursor

在SQL,While循环,递归存储过程或游标中哪个更快? 我想在存储过程中的几个位置优化性能。 我正在优化的代码格式化一些字符串以输出到文件。

7 个答案:

答案 0 :(得分:18)

我假设您使用的是SQL Server。

首先,正如有人在语句中所说的那样,尽管可能,递归存储过程在SQL Server中并不是一个好主意,因为堆栈大小。因此,任何深度递归的逻辑都会破坏。 但是,如果最多有2-3级嵌套,则可以尝试使用递归或使用CTE,这也有点递归(SQL Server 2005及更高版本)。一旦你设法绕过CTE,它就是一种非常有用的技术。 我没有测量过,但我在使用过CTE的几个地方从未遇到性能问题。

另一方面,游标是性能较高的游戏,因此我(and half the internet)会建议不要在经常调用的代码中使用它们。但是由于游标更像是一种经典的编程结构,类似于C#中的foreach,有些人发现使用游标进行数据操作的SQL代码更容易查看,理解和维护,而不是一些复杂的内部选择SQL monstrosity,所以在代码中使用它们并不是最糟糕的想法,偶尔会调用它。

说到while,它还将编程思维模式从基于集合的思维模式转移到基于过程的思维模式,因此虽然它相对较快并且不消耗大量资源,但仍然可以大幅增加数量您发给数据库本身的数据操作语句。

总而言之,如果我必须制作一个复杂的存储过程,其中性能至关重要,我会尝试:

  1. 使用基于集合的方法(内部选择,联接,联合等)
  2. 使用CTE(对于有经验的用户来说清晰且易于管理,对初学者来说是阴暗的)
  3. 使用控制流语句(if,while ...)
  4. 使用游标(程序代码,易于理解)
  5. 按顺序

    如果代码的使用频率较低,我可能会在1和2之前移动3和4,但同样,仅适用于使用大量表格和大量关系的复杂场景。当然,YMMV,所以我会测试我在现实场景中所做的任何程序,以实际测量性能,因为,我们可以说话,直到我们面对蓝色,这很快,而且很慢,但直到你得到真正的测量结果,没有办法判断变化是否使事情变得更好或更糟。

    而且,不要忘记,代码只能与您的数据一样快。没有替代好的索引。

答案 1 :(得分:9)

D)以上都不是。

基于集合的方法几乎总是最快的方法。在不知道你的实际代码是什么(或接近近似)的情况下,很难说这是否可行或哪种方法最快。

您最好的选择是测试您拥有的所有可能方法,并查看哪一种方法真正最快。

答案 2 :(得分:4)

如果您想提高性能,那么您需要查看基于SET的操作。虽然循环和游标基本相同。 SET中的SQL工作原理不是过程语言,使用它的方式如何使用

答案 3 :(得分:3)

查看Cursors and How to Avoid Them,它将为您提供有关如何使用基于SET的操作替换游标的建议

答案 4 :(得分:1)

递归存储过程可能是最慢的,而循环和游标不是互斥的。游标操作非常快(IME),但我只使用它们来自外部(非SQL)代码。其他海报是正确的,如果你能以面向集合的方式进行处理,你将获得最佳性能。

答案 5 :(得分:1)

如果你有时间的话,有一篇关于游标的3篇博文,值得一读。我也像瘟疫一样避免它们,但是这个博客让我以不同的眼光看待它们......好吧......我现在略微贬低它们但仍然不会使用它们!

The Truth About Cursors

答案 6 :(得分:0)