有没有像Parallel CURSOR这样的东西?

时间:2011-10-07 22:31:47

标签: sql sql-server tsql sql-server-2008

我使用CURSOR来做一些逐行操作。

OPEN CURSOR_T

FETCH NEXT FROM ...

WHILE @@FETCH_STATUS = 0
BEGIN
      ... Block begins

      ... Block Inserts results into a table

      ... Block terminates
END

我想知道为什么这不能并行执行,因为行操作完全隔离并且只将一些行插入另一个表中,并且每行都分配了自己的ID,因此没有明显的冲突可能性。

我想知道是否有办法在纯SQL中并行化这个?

2 个答案:

答案 0 :(得分:2)

您可以将from语句拆分为多个部分,并在单独的连接中运行它们。例如,对于第一个连接,使用偶数id处理所有行:

DECLARE cursor_t CURSOR FOR select id from books where id % 2 = 0

对于第二个连接,所有行都有一个奇数id

DECLARE cursor_t CURSOR FOR select id from books where id % 2 = 1

您还可以检查是否可以消除光标。如果你可以使用基于集合的操作重写游标,它会更快,并且SQL Server可以自动并行运行它。

答案 1 :(得分:2)

这通常是通过队列实现的:你选择'待办事项'并将它们放入队列,同时队列读者(处理线程)将'待办事项'出列并逐个处理它们一。在using tables as queues中有一个很好的艺术,处理通常与activation相关联,并且入队/出队周期实际上是连续的。