Em um ponto, respondi a essa pergunta no StackOverflow , mas parece que seria útil ter essas informações no DBA.SE também, revisadas e atualizadas.
Apenas para ser totalmente explícito: o TSQL não possui (por si só) a capacidade de iniciar outras operações do TSQL de forma assíncrona .
Isso não significa que você ainda não tem muitas opções (algumas delas mencionadas em outras respostas):
- Tarefas do SQL Agent : crie várias tarefas SQL e agende-as para serem executadas no horário desejado ou inicie-as de forma assíncrona a partir de um processo armazenado "controle mestre"
sp_start_job
. Se você precisar monitorar seu progresso programaticamente, verifique se os trabalhos atualizam uma tabela JOB_PROGRESS personalizada (ou verifique se eles terminaram de usar a função não documentada, xp_sqlagent_enum_jobs
conforme descrito neste excelente artigo de Gregory A. Larsen). Você precisa criar quantos trabalhos separados quiser que processos paralelos sejam executados, mesmo se eles estiverem executando o mesmo processo armazenado com parâmetros diferentes.
- Pacote SSIS : crie um pacote SSIS com um fluxo de tarefas de ramificação simples. O SSIS iniciará essas tarefas em spids individuais, que o SQL executará em paralelo.
- Aplicativo personalizado : escreva um aplicativo personalizado simples no idioma de sua escolha (C #, Powershell etc.), usando os métodos assíncronos fornecidos por esse idioma. Chame um proc armazenado SQL em cada encadeamento de aplicativo.
- Automação OLE : no SQL, use
sp_oacreate
e sp_oamethod
para iniciar um novo processo chamando um ao outro proc armazenado, conforme descrito neste artigo , também por Gregory A. Larsen.
- Service Broker : consulte o Service Broker , um bom exemplo de execução assíncrona neste artigo .
- Execução paralela de CLR : use os comandos CLR
Parallel_AddSql
e Parallel_Execute
conforme descrito neste artigo por Alan Kaplan (somente SQL2005 +).
- Tarefas agendadas do Windows : listadas quanto à integridade, mas não sou fã dessa opção.
Se fosse eu, provavelmente usaria vários trabalhos do SQL Agent em cenários mais simples e um pacote SSIS em cenários mais complexos.
No seu caso, a menos que você esteja tentando iniciar 200 threads separados, vários trabalhos agendados do Agente parecerão uma opção simples e gerenciável.
Um comentário final : o SQL já tenta paralelizar operações individuais sempre que pode *. Isso significa que a execução de duas tarefas ao mesmo tempo, em vez de uma após a outra, não garante que será concluída mais cedo. Teste com cuidado para ver se ele realmente melhora alguma coisa ou não.
Tivemos um desenvolvedor que criou um pacote DTS para executar 8 tarefas ao mesmo tempo. Infelizmente, era apenas um servidor com 4 CPUs :)
* Assumindo configurações padrão. Isso pode ser modificado alterando o Grau máximo de paralelismo ou Máscara de afinidade do servidor ou usando a dica de consulta MAXDOP.