26

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

4

4 回答 4

23

我假设您使用的是 SQL Server。

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

另一方面,游标会消耗大量性能,因此我(以及一半的互联网用户)建议不要在经常调用的代码中使用它们。但是由于游标更像是一种经典的编程结构,类似于foreachC# 中的 a,因此有些人发现使用游标进行数据操作的 SQL 代码更容易查看、理解和维护,而不是一些复杂的多内选 SQL 怪物,所以它是在偶尔调用的代码中使用它们并不是最糟糕的主意。

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

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

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

以该顺序。

如果代码使用频率低得多,我可能会将 3 和 4 移到 1 和 2 之前,但同样,仅适用于使用大量表和大量关系的复杂场景。当然,YMMV,所以我会测试我在现实世界场景中所做的任何程序,以实际测量性能,因为,我们可以谈论直到我们脸色发青,这很快,那很慢,但直到你得到了真实的测量结果,没有办法判断变化是使事情变得更好还是更糟。

而且,不要忘记,代码的速度与您的数据一样快。没有什么可以替代良好的索引。

于 2010-06-11T13:36:02.800 回答
9

D) 以上都不是。

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

你最好的办法是测试你拥有的所有可能的方法,看看哪一种是真正最快的。

于 2010-06-11T13:16:10.020 回答
3

如果您想提高性能,那么您需要查看基于 SET 的操作,While 循环和游标基本上是一回事。SQL 在 SET 中工作,它不是一种过程语言,请按预期使用它

于 2010-06-11T13:16:41.890 回答
2

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

于 2010-06-11T13:31:19.763 回答