Есть ли что-то вроде Parallel CURSOR? - PullRequest
4 голосов
/ 08 октября 2011

Я использую CURSOR для выполнения ряда построчных операций.

OPEN CURSOR_T

FETCH NEXT FROM ...

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

      ... Block Inserts results into a table

      ... Block terminates
END

Мне было интересно, почему это не может быть выполнено параллельно, поскольку операции со строками полностью изолированы и вставляют только некоторые строки в другую таблицу, и каждой строке назначается собственный идентификатор, поэтому очевидной возможностиконфликт.

Мне было интересно, есть ли способ распараллелить это в чистом SQL?

Ответы [ 2 ]

2 голосов
/ 08 октября 2011

Обычно это достигается через очередь: вы выбираете элементы «делать» и помещаете их в очередь, и в то же время средства чтения очереди (обрабатывающие потоки) снимают с очереди элементы «делать» и обрабатывают их по одному один. В есть изобразительное искусство, использующее таблицы в качестве очередей , обработка часто связана с активацией , и цикл постановки / удаления фактически является смежным.

2 голосов
/ 08 октября 2011

Вы можете разделить оператор 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 может запустить его параллельно автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...