游标真的有多慢,哪种更好的选择?

时间:2010-11-22 22:41:37

标签: performance sql-server-2005 cursor

我一直在阅读游标非常slow,除非有选项,否则应该避免游标。我正在尝试优化我的存储过程,其中一个使用游标。我的应用程序和许多用户(20000)以及要更新的行经常调用它。我想也许我应该用别的东西作为替代品。

我想要做的或想要的是获取记录列表,然后根据每个行值进行操作。因此,例如我们说 -

Employee - Id,Name,BenefitId,StartDate,EndDate

因此,基于benefitId,我需要使用StartDate和EndDate之间的日期进行不同的计算,并更新员工详细信息。我正在制作这个人为的例子,以便了解我的情况。

你对此有何看法?是否有更好的替代游标,比如使用临时表或用户定义的函数?你什么时候应该选择它们,还是我们永远不会使用游标?感谢大家的帮助。

4 个答案:

答案 0 :(得分:2)

我曾经将存储过程从游标更改为基于集合的逻辑。运行时间从8小时到22秒。这就是我们正在谈论的那种差异。

不要一次对记录采取不同的操作,而是对数据使用多次传递。更新并设置field1 = A,其中field2为X,然后更新并设置field1 = B,其中field2为Y,等等。

答案 1 :(得分:1)

如果您的名字是Jeff Moden,则游标会逐行处理,或者“按行划分行”。

这只是one example如何进行基于集合的SQL编程而不是RBAR,但它最终取决于你的光标在做什么。

另外,请看一下StackOverflow:

RBAR vs. Set based programming for SQL

答案 2 :(得分:1)

我更换了游标,并将处理时间从24小时缩短到不到一分钟。

为了帮助您了解如何使用基于集合的逻辑修复过程,请阅读: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

答案 3 :(得分:-1)

首先,听起来您正试图在存储过程中混合一些业务逻辑。这通常是你想要避免的事情。更好的解决方案是拥有一个封装该业务逻辑的中间层。这样,您的数据层仍然是纯粹的数据。

要回答您的原始问题,这实际上取决于您使用游标的内容。在某些情况下,您可以使用表变量或临时表。你必须记住释放临时表,所以我建议尽可能使用表变量。但有时候,使用游标是没有办法的。也许原始的DBA没有足够的规范化(或规范化太多),你被迫使用游标遍历多个表而没有任何外键关系。