À un moment donné, j'ai répondu à cette question sur StackOverflow , mais il semble qu'il serait utile d'avoir également ces informations sur DBA.SE, révisées et mises à jour.
Juste pour être totalement explicite: TSQL n'a pas (en soi) la possibilité de lancer d'autres opérations TSQL de manière asynchrone .
Cela ne signifie pas que vous n'avez pas encore beaucoup d'options (certaines d'entre elles sont mentionnées dans d'autres réponses):
- Tâches de l'Agent SQL : créez plusieurs tâches SQL et planifiez-les pour qu'elles s'exécutent à l'heure souhaitée ou démarrez-les de manière asynchrone à partir d'un proc stocké de «contrôle maître» à l'aide de
sp_start_job
. Si vous devez surveiller leur progression par programme, assurez-vous simplement que les travaux mettent chacun à jour une table JOB_PROGRESS personnalisée (ou vous pouvez vérifier s'ils n'ont pas encore utilisé la fonction non documentée, xp_sqlagent_enum_jobs
comme décrit dans cet excellent article de Gregory A. Larsen). Vous devez créer autant de tâches distinctes que vous voulez que les processus parallèles s'exécutent, même s'ils exécutent le même proc stocké avec des paramètres différents.
- Package SSIS : créez un package SSIS avec un flux de tâches de branchement simple. SSIS lancera ces tâches dans des spids individuels, que SQL exécutera en parallèle.
- Application personnalisée : rédigez une application personnalisée simple dans la langue de votre choix (C #, Powershell, etc.), en utilisant les méthodes asynchrones fournies par cette langue. Appelez un proc stocké SQL sur chaque thread d'application.
- OLE Automation : dans SQL, utilisez
sp_oacreate
et sp_oamethod
pour lancer un nouveau processus s'appelant entre eux proc stocké comme décrit dans cet article , également par Gregory A. Larsen.
- Service Broker : examinez l'utilisation de Service Broker , un bon exemple d'exécution asynchrone dans cet article .
- Exécution parallèle CLR : utilisez les commandes CLR
Parallel_AddSql
et Parallel_Execute
comme décrit dans cet article par Alan Kaplan (SQL2005 + uniquement).
- Tâches Windows planifiées : répertoriées pour être complètes, mais je ne suis pas fan de cette option.
Si c'était moi, j'utiliserais probablement plusieurs tâches d'agent SQL dans des scénarios plus simples et un package SSIS dans des scénarios plus complexes.
Dans votre cas, à moins que vous n'essayiez de lancer 200 threads distincts, plusieurs tâches d'agent planifiées semblent être un choix simple et gérable.
Un dernier commentaire : SQL tente déjà de paralléliser les opérations individuelles chaque fois qu'il le peut *. Cela signifie que l'exécution de 2 tâches en même temps au lieu l'une de l'autre ne garantit pas qu'elle se terminera plus tôt. Testez soigneusement pour voir si cela améliore réellement quelque chose ou non.
Nous avons eu un développeur qui a créé un package DTS pour exécuter 8 tâches en même temps. Malheureusement, ce n'était qu'un serveur à 4 CPU :)
* En supposant les paramètres par défaut. Cela peut être modifié en modifiant le degré maximal de parallélisme ou le masque d'affinité du serveur, ou en utilisant l'indicateur de requête MAXDOP.