2008-12-08 2 views
10

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

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

На данный момент мы все еще на SQL Server 2000.

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

ответ

11

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

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

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

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

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

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

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

3

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

Затем с вашего мастер-процесса начинаются задания.

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

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

Последствия памяти полностью до среды ..

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

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

+0

Похоже, это может сработать, но создание рабочих мест не является чем-то, что здесь поощряется. Даже основная процедура, о которой я говорю здесь, - это не работа - она ​​запускается через отдельную программу из запланированной задачи Windows. – 2008-12-08 16:26:36

+0

Идея .exe немного привлекательнее, хотя мне все же хотелось бы знать, возможно ли это сделать в самом SQL-сервере разумным способом. Это должно быть, если это не так. – 2008-12-08 16:52:15

2

Вам нужно переместить на ночь sprocs на работу , Управление заданиями SQL Server позволит вам выполнить все запланированные вами расписания.

2

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

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

Смежные вопросы