En un momento respondí esta pregunta en StackOverflow , pero parece que sería útil tener esa información también en DBA.SE, revisada y actualizada.
Solo para ser totalmente explícito: TSQL no tiene (por sí mismo) la capacidad de lanzar otras operaciones TSQL de forma asincrónica .
Eso no significa que todavía no tenga muchas opciones (algunas de ellas mencionadas en otras respuestas):
- Trabajos del Agente SQL : Cree múltiples trabajos SQL, y prográmelos para que se ejecuten en el momento deseado, o inícielos asíncronamente desde un proceso almacenado de "control maestro" usando
sp_start_job
. Si necesita monitorear su progreso programáticamente, solo asegúrese de que cada trabajo actualice una tabla JOB_PROGRESS personalizada (o puede verificar si han terminado de usar la función no documentada xp_sqlagent_enum_jobs
como se describe en este excelente artículo de Gregory A. Larsen). Debe crear tantos trabajos separados como desee que se ejecuten los procesos paralelos, incluso si están ejecutando el mismo proceso almacenado con diferentes parámetros.
- Paquete SSIS : cree un paquete SSIS con un flujo de tareas de ramificación simple. SSIS lanzará esas tareas en spids individuales, que SQL ejecutará en paralelo.
- Aplicación personalizada : escriba una aplicación personalizada simple en el idioma que elija (C #, Powershell, etc.), utilizando los métodos asincrónicos proporcionados por ese idioma. Llame a un proceso almacenado de SQL en cada subproceso de aplicación.
- Automatización OLE : en SQL, use
sp_oacreate
y sp_oamethod
para iniciar un nuevo proceso que se llame entre sí a un proceso almacenado como se describe en este artículo , también por Gregory A. Larsen.
- Service Broker : considere el uso de Service Broker , un buen ejemplo de ejecución asincrónica en este artículo .
- Ejecución paralela de CLR : utilice los comandos CLR
Parallel_AddSql
y Parallel_Execute
como se describe en este artículo de Alan Kaplan (solo SQL2005 +).
- Tareas programadas de Windows : enumeradas para completar, pero no soy fanático de esta opción.
Si fuera yo, probablemente usaría múltiples trabajos de Agente SQL en escenarios más simples y un paquete SSIS en escenarios más complejos.
En su caso, a menos que esté tratando de iniciar 200 subprocesos separados, varios trabajos programados del Agente suenan como una opción simple y manejable.
Un comentario final : SQL ya intenta paralelizar operaciones individuales siempre que puede *. Esto significa que ejecutar 2 tareas al mismo tiempo en lugar de una tras otra no garantiza que terminará antes. Pruebe cuidadosamente para ver si realmente mejora algo o no.
Tuvimos un desarrollador que creó un paquete DTS para ejecutar 8 tareas al mismo tiempo. Desafortunadamente, solo era un servidor de 4 CPU :)
* Asumiendo la configuración predeterminada. Esto puede modificarse alterando el Grado máximo de paralelismo o la Máscara de afinidad del servidor, o utilizando la sugerencia de consulta MAXDOP.