2017-07-28 34 views
1

我创造了许多光标在我的应用程序通过行操作中我只选择了500或1000个记录每个光标单次运行执行行,以便光标可以完成的循环在单次运行中很快成为postilion,换句话说,我为单个游标运行选择了有限数量的记录。SQL服务器 - 虽然与“本地静态READ_ONLY FORWARD_ONLY”光标

要执行光标更快,而不是放在我用以下声明光标的两种服务器的负载。

宣言1: DECLARE DB_CURSOR_01 CURSOR本地静态READ_ONLY FORWARD_ONLY FOR

宣言2: DECLARE DB_CURSOR_02 CURSOR FAST_FORWARD FOR

注:我不使用鼠标的默认声明,我正在使用其他类型的游标使其工作得更快,据我所知,上面提到的声明1比声明2更快,纠正我,如果我错了。

问: 由行操作做行的另一种方式是通过“在使用临时表圈”。所以,现在我的问题是,如果我使用临时表将所有游标转换为while循环,是否有助于提高服务器性能?

其实我们的DBA指出,服务器的性能是因为游标的影响,如果我把那么多的努力,所有这些光标到while循环,它会给我带来的性能优势的转换?或者我在上面声明的声明1中声明游标的方式与while循环的性能相同?

+0

带临时表的while循环是怎么样的? – IngoB

+0

您确定无法用单个更新替代游标(例如,在临时表中)吗?我们过去用游标开发了大量的迁移,一次迁移需要数小时才能运行。然后我们意识到,用简单的更新来替换所有的游标是非常容易的,这使得与光标解决方案相比,迁移闪电很快。 – IngoB

+0

@IngoB在我的情况下,我不只是在单个表上进行更新,在我的游标下,我正在执行的操作可能与执行其他选择语句的计算然后将数据插入到其他表中一样。这只是一个例子,我可能会有不同的游标执行不同的操作。 –

回答

0

游标在SQL Server中是非常慢的。在其他RDBMS上,例如Sybase,它们都可以。

下面是如何处理与他们实际的做法:

在我的“优化”狡猾的老代码的经验,使用游标的主要问题是,当它们是基于一个复杂的查询。通过复杂的查询,我的意思是一个具有多个连接和/或复杂连接条件的查询。 光标确实是什么,每次迭代,它具有运行此联接操作,这可能需要比循环的体内运作更多的时间。

在类似这些情况下,方式更有效地运行单个选择到一个临时表,然后使用临时表中的光标,一个替代的方式是使用STATICINSENSITIVE关键字(MSDN)。要考虑的一个重要方面是并发性;通过将主游标查询的结果保存到临时表中,可以防止对游标可见的基础表的更改。

第二方面要考虑的是一个光标内选择查询。这是非常重要的,因为每个查询都针对每个游标迭代运行,因此在大型表上进行选择会消耗大量资源。

我看到其中一些尤其是“不可靠”的代码:

  • 甲查询表以返回使用光标的取变量作为滤波器的一个单一值。 - 这个表应该是JOIN ed的主游标查询。通过这种方式,这个表格只被查询一次,并将结果保存到临时表格中。
  • 查询表以根据某些条件返回一些数据,然后再次查询以基于相同条件返回更多数据(不同列)。 - 这两个选择应该合并为一个,以便所有数据(所有列)可以一次返回。

如果你有嵌套游标(一个在另一个内),它是杀手。尝试删除嵌套。

如果你有很多使用游标的地方,优先考虑与上述情况相匹配的地方。

P.S.虽然循环是自己的不会救你。您仍然需要使用临时表并在临时表上有适当的索引。请参阅:https://dba.stackexchange.com/questions/84365/why-choose-a-top-query-and-temporary-table-instead-of-a-cursor-for-a-loop

上述链接到Aaron Bertrand博客,其中讨论性能以及游标选项的建议。