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

问题描述 投票:21回答:7

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

sql-server performance stored-procedures while-loop cursor
7个回答
18
投票

我假设你使用的是SQL Server。

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

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

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

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

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

以该顺序。

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

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


9
投票

D)以上都不是。

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

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


4
投票

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


3
投票

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


1
投票

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


1
投票

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

The Truth About Cursors


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.