Performance 游标的速度到底有多慢?有什么更好的选择?

Performance 游标的速度到底有多慢?有什么更好的选择?,performance,sql-server-2005,cursor,Performance,Sql Server 2005,Cursor,我一直在读到,游标很漂亮,除非没有选择,否则应该避免使用它们。我试图优化我的存储过程,其中一个使用了游标。它经常被我的应用程序调用,有很多用户(20000)和行需要更新。我在想也许我应该用别的东西作为替代 我想做或想要做的就是得到一个记录列表,然后根据每一行的值进行操作。例如,我们有话要说- Employee - Id,Name,BenefitId,StartDate,EndDate 因此,基于benefitId,我需要使用StartDate和EndDate之间的日期进行不同的计算,并更新员工

我一直在读到,游标很漂亮,除非没有选择,否则应该避免使用它们。我试图优化我的存储过程,其中一个使用了游标。它经常被我的应用程序调用,有很多用户(20000)和行需要更新。我在想也许我应该用别的东西作为替代

我想做或想要做的就是得到一个记录列表,然后根据每一行的值进行操作。例如,我们有话要说-

Employee - Id,Name,BenefitId,StartDate,EndDate
因此,基于benefitId,我需要使用StartDate和EndDate之间的日期进行不同的计算,并更新员工详细信息。我只是想用这个人为的例子来说明我的情况


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

我曾经将一个存储过程从游标更改为基于集合的逻辑。运行时间从8小时变为22秒。这就是我们所说的区别


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

光标进行逐行处理,如果您的名字是Jeff Moden,则“逐行处理”

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

另外,请看一下StackOverflow:


我已经更换了光标,将处理时间从24小时缩短到不到一分钟

要帮助您了解如何使用基于集合的逻辑修复进程,请阅读以下内容:

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


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

许多地方要求所有数据库访问都通过存储的属性。在dba可以调整性能的存储过程中进行复杂处理比在应用程序中进行类似处理更好。此外,几乎所有从应用程序运行的游标都可以轻松地替换为基于集合的逻辑。除了一些面向dba的管理任务外,很少需要游标。如果您要从一个或多个表中插入、更新或删除数据,您几乎可以100%的时间以基于集合的方式进行。我一直不明白为什么人们如此坚持将业务逻辑排除在数据库之外。我还没有遇到一个系统,在这个系统中,数据可以在没有逻辑的情况下以有意义的方式进行操作。不要介意我们比数据库供应商更频繁地更改编程语言,这可能是一个视角和语言选择的问题。程序员的母语将是他们当时使用的任何HL语言。DBA的母语是SQL。这是有道理的,人们会回到熟悉的角度。我同意视角/语言的选择与我们的设计决策有很大关系。我无法找到这个链接。作为一种可能的选择,我发现下面的链接提供了有用的信息和示例