Параллельное выполнение хранимой процедуры - PullRequest
0 голосов
/ 31 октября 2011

Как заголовок, как выполнить хранимую процедуру параллельно?

Более подробно, у меня есть хранимая процедура, созданная в Sql Server, вызовом Execute_Sql и передачей одного параметра AreaID INT в качестве аргумента.

Я позвонил и успешно выполнил из .net C #, передавая по одному идентификатору за раз с циклическим идентификатором, чтобы получить New_ID.

Здесь моя проблема, я пытаюсь сделать параллельный способ выполнения сохраненного продукта. Например, когда я выполняю ID = 1, в то же время я также выполняю ID = 2.

Что мне пришло в голову в потоке, который создал параллельный способ обработки. Есть ли способ сделать это при выполнении хранимого продукта?

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Для начала было бы полезно, если бы вы опубликовали свой код. Довольно часто SQL можно модифицировать для обработки нескольких значений «на основе множеств». Другими словами, если у вас есть набор значений для обработки, вы можете обрабатывать их все одновременно.

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

Вы также можете передать XML и "присоединиться" к XML в вашем процессе, используя APPLY.

В SQL 2008+ вы можете использовать Таблица значений параметров

Поскольку я не знаю, что именно вы делаете с параметром AreaID, я не знаю, ответил ли я на ваш вопрос, поэтому здесь есть дополнительная информация.

Если вы хотите запустить хранимую процедуру асинхронно, вам лучше всего выбрать Service Broker, который позволит вам поместить параметр в очередь, и отдельные потоки будут обрабатывать очередь. SQL управляет всеми потоками упорядочения, блокировок, повторов, порождения / уничтожения и т. Д. Это очень надежная система.

Есть комментарий к вопросу от другого пользователя, который, кажется, подключен к OP относительно отслеживания прогресса. Вот мысль:

У вас есть таблица "queue", которая содержит batchid, параметр areaID и флаг состояния.

CREATE TABLE asynchQueue
(
    RecNo INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    BatchID INT,
    AreaID INT,
    Status TINYINT
)

Приложение C # вставляет в таблицу очередей уникальный идентификатор пакета для вашего приложения и вызова (для группировки запросов)

У вас запланирован периодический запуск процесса, например:

CREATE PROC ProcessQueue
AS
BEGIN
    SET XACT_ABORT ON

    DECLARE @RecNo INT,
            @AreaId INT

    BEGIN TRAN
        SELECT TOP 1 @RecNo = recNo,
               @AreaID = areaId 
        FROM AsynchQueue WITH ROWLOCK, XLOCK
        WHERE Status = 0 

        UPDATE AsynchQueue SET Status = 1  --Mark record as in progress
         WHERE RecNo = @RecNo
    COMMIT 

    EXEC YourProc @AreaId

    UPDATE AsynchQueue SET Status = 2 -- Mark Record as complete
         WHERE RecNo = @RecNo         

 END

Или процедура может содержать цикл для обработки всех записей в таблице. Процесс может быть запланирован или вызван по требованию, используя sp_start_job, как предложил Джон Уэлдон.

Затем вы можете запросить статус следующим образом:

SELECT COUNT(NULLIF(Status, 0))/COUNT(*) as PctComplete --in progress or complete div by total
FROM AsynchQueue WITH NOLOCK
WHERE BatchID = @yourBatchId

Этот запрос даст вам процент выполнения вашей партии.

0 голосов
/ 31 октября 2011

Вы можете расследовать sp_start_job

Однако вы не можете передавать параметры в задания, поэтому вам нужно будет ввести их другими способами.

Вы могли бы настроить задание так, чтобы оно считывало параметры из таблицы, и заполняло таблицу значениями, с которыми вы хотите запустить sproc, а затем запускало бы несколько обращений к заданию.

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

http://msdn.microsoft.com/en-us/library/ms186757.aspx

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