В какой-то момент я ответил на этот вопрос в StackOverflow , но, похоже, было бы полезно, чтобы эта информация также была в DBA.SE, пересмотрена и обновлена.
Просто чтобы быть абсолютно четко: TSQL делает не (само по себе) имеют возможность запускать другие операции Tsql асинхронно .
Это не значит, что у вас все еще нет большого количества вариантов (некоторые из них упомянуты в других ответах):
- Задания агента SQL : создайте несколько заданий SQL и либо запланируйте их выполнение в нужное время, либо запустите их асинхронно из хранимого процесса «главный элемент управления», используя
sp_start_job
. Если вам нужно контролировать их прогресс программно, просто убедитесь, что каждое из заданий обновляет пользовательскую таблицу JOB_PROGRESS (или вы можете проверить, закончили ли они еще, используя недокументированную функцию, xp_sqlagent_enum_jobs
как описано в этой замечательной статье Грегори А. Ларсена). Вам нужно создать столько отдельных заданий, сколько вы хотите, чтобы выполнялись параллельные процессы, даже если они запускают один и тот же хранимый процесс с разными параметрами.
- Пакет служб SSIS : создайте пакет служб SSIS с простым потоком задач ветвления. Службы SSIS будут запускать эти задачи в отдельных спидах, которые SQL будет выполнять параллельно.
- Пользовательское приложение : напишите простое пользовательское приложение на языке по вашему выбору (C #, Powershell и т. Д.), Используя асинхронные методы, предоставляемые этим языком. Вызовите хранимую процедуру SQL в каждом потоке приложения.
- Автоматизация OLE : В SQL используйте
sp_oacreate
и sp_oamethod
для запуска нового процесса, вызывающего друг друга хранимым процессом, как описано в этой статье , также Грегори А. Ларсен.
- Компонент Service Broker . Рассмотрим использование компонента Service Broker , который является хорошим примером асинхронного выполнения в этой статье .
- CLR Параллельное выполнение : С помощью команды CLR
Parallel_AddSql
и , Parallel_Execute
как описано в этой статье Алан Каплан (SQL2005 + только).
- Запланированные задачи Windows : перечислены для полноты, но я не фанат этой опции.
Если бы это был я, я бы, вероятно, использовал несколько заданий агента SQL в более простых сценариях и пакет служб SSIS в более сложных сценариях.
В вашем случае, если вы не пытаетесь запустить 200 отдельных потоков, несколько запланированных заданий агента звучат как простой и управляемый выбор.
Последний комментарий : SQL уже пытается распараллеливать отдельные операции, когда это возможно *. Это означает, что выполнение 2 задач одновременно, а не после друг друга, не гарантирует, что оно завершится раньше. Проверьте внимательно, чтобы увидеть, действительно ли это что-то улучшает или нет.
У нас был разработчик, который создал пакет DTS для запуска 8 задач одновременно. К сожалению, это был только 4-х процессорный сервер :)
* Предполагая настройки по умолчанию. Это можно изменить, изменив максимальную степень параллелизма или маску сходства на сервере, или воспользовавшись подсказкой запроса MAXDOP.