我使用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中并行化这个?
答案 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相关联,并且入队/出队周期实际上是连续的。