Запускайте хранимые процедуры последовательно или параллельно - PullRequest
11 голосов
/ 08 декабря 2008

У нас есть хранимая процедура, которая выполняется ночью, что, в свою очередь, запускает ряд других процедур. Некоторые из этих процедур могут логически выполняться параллельно с другими.

  • Как мне указать SQL Server, должна ли процедура выполняться параллельно или последовательно & mdash; то есть: стартует асинхронно или блокируется?
  • Каковы будут последствия их параллельной работы, учитывая, что я уже определил, что процессы не будут конкурировать за доступ к таблице или блокировки - только общий объем дискового ввода-вывода и памяти. По большей части они даже не используют одни и те же таблицы.
  • Имеет ли значение, если некоторые из этих процедур одинаковы , только с другими параметрами?
  • Если я запускаю пару или процедуры асинхронно, то есть ли в SQL Server хорошая система для ожидания завершения обоих из них, или мне нужно, чтобы каждая из них установила флаг где-то, периодически проверяла и опрашивала используя WAITFOR DELAY?

В данный момент мы все еще находимся на SQL Server 2000.

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

Ответы [ 4 ]

12 голосов
/ 10 января 2011

Мне пришлось исследовать это недавно, поэтому я нашел этот старый вопрос, который требовал более полного ответа. Проще говоря: TSQL не (сам по себе) имеет возможность запускать другие операции TSQL асинхронно .

Это не значит, что у вас все еще мало вариантов (некоторые из них упоминаются в других ответах):

  • Пользовательское приложение : напишите простое пользовательское приложение на выбранном вами языке, используя асинхронные методы. Вызовите хранимую процедуру SQL в каждом потоке приложения.
  • Задания агента SQL : создание нескольких заданий SQL и асинхронный запуск их из вашего процесса с помощью sp_start_job. Вы можете проверить, закончили ли они еще, используя недокументированную функцию xp_sqlagent_enum_jobs, как описано в этой превосходной статье Грегори А. Ларсена. (Или попросите сами задания обновить свою собственную таблицу JOB_PROGRESS, как предлагает Крис.) Вам буквально придется создавать отдельное задание для каждого параллельного процесса, который вы ожидаете запустить, даже если они запускают один и тот же сохраненный процесс с разными параметрами.
  • OLE Automation : используйте sp_oacreate и sp_oamethod для запуска нового процесса, вызывающего другой сохраненный процесс, как описано в этой статье , также Грегори А. Ларсен.
  • Пакет DTS : создание пакета DTS или SSIS с простым потоком задач ветвления. DTS будет запускать задачи в отдельных спидах.
  • Service Broker : Если вы используете SQL2005 +, изучите возможность использования Service Broker
  • CLR Parallel Execution : Используйте команды CLR Parallel_AddSql и Parallel_Execute, как описано в этой статье Алана Каплана (только SQL2005 +).
  • Запланированные задачи Windows : указаны для полноты, но я не фанат этой опции.

У меня нет большого опыта работы с Service Broker или CLR, поэтому я не могу комментировать эти параметры. Если бы это был я, я бы, вероятно, использовал несколько заданий в более простых сценариях и пакет DTS / SSIS в более сложных сценариях.

Один последний комментарий : SQL уже пытается распараллеливать отдельные операции, когда это возможно *. Это означает, что выполнение 2 задач одновременно, а не после друг друга, не гарантирует, что оно завершится раньше. Проверьте внимательно, чтобы увидеть, действительно ли это что-то улучшает или нет.

У нас был разработчик, который создал пакет DTS для одновременного выполнения 8 задач. К сожалению, это был только 4-х процессорный сервер:)

* Принятие настроек по умолчанию. Это можно изменить, изменив максимальную степень параллелизма или маску сходства на сервере, или воспользовавшись подсказкой запроса MAXDOP.

3 голосов
/ 08 декабря 2008

Создайте пару заданий агента SQL Server, где каждое из них запускает определенный процесс.

Тогда изнутри ваш мастер прокачает работу.

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

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

Значения памяти полностью зависят от вашей среды ..

UPDATE: Если у вас есть доступ к системе задач ... тогда вы можете использовать тот же подход. Просто сделайте так, чтобы окна выполняли несколько задач, каждая из которых отвечает за один процесс. Затем используйте триггер в таблице состояния, чтобы начать что-либо, когда все задачи завершены.

UPDATE2: Кроме того, если вы хотите создать новое приложение, вы можете поместить всю логику в один исполняемый файл ...

2 голосов
/ 08 декабря 2008

Возможно, вы захотите изучить использование DTS (который можно запустить из агента SQL в качестве задания). Это позволит вам довольно точно контролировать, какие хранимые процедуры должны ждать завершения других, а какие могут выполняться параллельно. При необходимости вы также можете запустить пакет DTS как EXE-файл из собственного программного обеспечения для планирования.

ПРИМЕЧАНИЕ: Вам потребуется создать несколько копий объектов подключения, чтобы разрешить параллельные вызовы. Два вызова, использующие один и тот же объект подключения, будут по-прежнему блокировать друг друга, даже если вы не указали явно зависимость.

2 голосов
/ 08 декабря 2008

Вам нужно переместить ваших ночных звезд на работу. Контроль заданий SQL Server позволит вам выполнить все запрошенное планирование.

...