什么是SQL游标的替代品

时间:2010-03-08 12:22:29

标签: sql-server-2008

我继承了一个数据库,里面有很多游标,从我读过的,游标,非常慢和资源饥饿。如果可能的话,我想删除这些,并用其他东西替换。我对CTE很熟悉,但是想知道WHILE 1 = 1循环中的CTE是否是最佳实践?

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

你应该真的想要删除任何类型的循环。如果可以将游标重写为基于集合的语句(无循环),那么您应该这样做。

将游标转换为另一种形式的循环可以减少开销,但仍然无法解决性能问题。

当然,有时需要做循环 - 但你通常应该尽量将那些最小化

答案 1 :(得分:1)

在你找到很多游标的地方,它往往指向一个可怜的SQL开发人员在编写SQL代码时过于程序化。

尝试找到可以将过程类型代码转换为SQL自己的基于集合的范例的区域。

答案 2 :(得分:1)

为什么你认为你需要循环,这是非常必要的。游标有什么样的东西?没有更具体的例子,很难提供帮助。

我有一些建议,而不是在游标中使用values子句进行插入,而是使用基于集合的插入中的游标中的select。 (更新和删除也可以通过连接到您在光标选择中选择的数据而不是一次一个记录来完成)

如果您正在对特定数据元素进行特殊处理,则CASE语句通常是一种更好的,基于集合的方式来处理相同的事情。

如果您决定是否更新或插入,请查看MERGE。

由于您的游标正在调用存储过程,因此您的开发人员在不合适时会重复使用代码。但是,在SQL Server 2008中,您现在有了一个新选项,可以将表作为变量发送到存储过程,因此您可以将proc重写为基于集合而不处理单个记录。然后你不再需要光标了。您将需要检查它在何处用于确保从同一个proc中插入的单个记录仍然可以正常运行(如果这样做)。没有什么说你不能发送一行表,但调用代码将发送正确的表参数而不是十个单独的字段。或者你可以通过抛弃你调用的存储过程并编写基于集合的插入来处理这个问题。

几乎可以肯定使用CASE语句处理业务逻辑。