Мне пришлось исследовать это недавно, поэтому я нашел этот старый вопрос, который требовал более полного ответа. Проще говоря: 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.