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

Cas*_*sey 22 sql-server performance stored-procedures cursor while-loop

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

SWe*_*eko 20

我假设你使用的是SQL Server.

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

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

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

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

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

以该顺序.

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

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


Tom*_*m H 9

D)以上都不是.

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

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

  • 使用bcp和queryout,在查询中做格式化,这假设是sql server,大多数rdbms都有类似的东西 (3认同)