Démarrer les procédures stockées de manière séquentielle ou parallèle
Nous avons une procédure stockée qui exécute tous les soirs, qui à son tour lance un certain nombre d'autres procédures. Certaines de ces procédures pourraient logiquement être exécuté en parallèle avec d'autres.
- Comment puis-je indiquer à SQL Server de savoir si une procédure doit être exécutée en parallèle ou en série — c'est à dire: a débuté de manière asynchrone ou le blocage?
- Quelles seraient les implications de l'exécution en parallèle, en gardant à l'esprit que j'ai déjà déterminé que le processus ne sera pas en concurrence pour l'accès à la table ou verrouille - seulement total d'e /s disque et de la mémoire. Pour la plupart, ils ne sont même pas utiliser les mêmes tables.
- Importe-t-il si certaines de ces procédures sont les même procédure, juste avec des paramètres différents?
- Si je commence une paire ou des procédures de manière asynchrone, est-il un bon système de SQL Server pour ensuite attendre les deux d'entre eux à la fin, ou dois-je besoin d'avoir chacun d'entre eux un drapeau quelque part et de vérifier et d'interroger le drapeau périodiquement à l'aide de
WAITFOR DELAY
?
Pour le moment, nous sommes toujours sur SQL Server 2000.
Comme une note de côté, c'est important parce que la procédure principale est lancé en réponse à l'achèvement d'un vidage des données dans le serveur à partir d'un système central. L'ordinateur central de vidage prend tous, mais environ 2 heures chaque nuit, et nous n'avons aucun contrôle sur elle. En conséquence, nous essayons constamment de trouver des moyens de réduire les délais de traitement.
source d'informationauteur Joel Coehoorn
Vous devez vous connecter pour publier un commentaire.
J'avais à la recherche de cette récemment, donc trouvé cette vieille question qui a été la mendicité pour une réponse plus complète. Juste pour être totalement explicite: TSQL ne pas (par lui-même) avons la possibilité de lancer d'autres TSQL opérations en mode asynchrone.
Cela ne signifie pas que vous n'avez pas encore beaucoup d'options (dont certains ont été mentionnés dans d'autres réponses):
sp_start_job
. Vous pouvez vérifier pour voir si ils ont fini sans-papiers à l'aide de la fonctionxp_sqlagent_enum_jobs
comme décrit dans cet excellent article par Gregory A. Larsen. (Ou ont les emplois eux-mêmes la mise à jour de votre propre JOB_PROGRESS table comme Chris suggère.) Vous littéralement créer des emplois pour chaque processus parallèle vous prévoyez d'exécuter, même si elles sont en cours d'exécution de la même procédure stockée avec des paramètres différents.sp_oacreate
etsp_oamethod
de lancer un nouveau processus d'appel des procédures stockées comme décrit dans cet articleégalement par Gregory A. Larsen.Parallel_AddSql
etParallel_Execute
comme décrit dans cet article par Alan Kaplan (SQL2005+ uniquement).Je n'ai pas beaucoup d'expérience avec le Service de Courtier ou d'CLR, donc je ne peux pas commenter sur ces options. Si c'était moi, je serais probablement utiliser plusieurs Emplois dans des scénarios plus simples, et un DTS/package SSIS dans des scénarios plus complexes.
Un commentaire final: SQL déjà des tentatives pour paralléliser les opérations individuelles chaque fois que possible*. Cela signifie que l'exécution de 2 tâches en même temps au lieu de les uns après les autres n'est pas une garantie que ça va se terminer plus tôt. Test avec soin pour voir si ça 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 4-CPU serveur 🙂
*En supposant que les paramètres par défaut. Ce peuvent être modifiées par le serveur du Degré Maximum de Parallélisme ou de Masque d'Affinité, ou à l'aide de l'indicateur de requête MAXDOP.
Créer un couple de SQL Server agent des emplois où chacun exécute un particulier proc.
Puis de l'intérieur de votre maître proc coup d'envoi de la des emplois.
La seule façon d'attente que je peux penser est que si vous avez un tableau d'état de chaque proc mises à jour quand il est terminé.
Puis encore un autre emploi sondage de la table pour l'achèvement total et le coup d'envoi d'une finale proc. Alternativement, vous pourriez avoir un déclencheur sur cette table.
La mémoire des implications sont complètement à votre environnement..
Mise à JOUR:
Si vous avez accès à la tâche du système.. ensuite, vous pouvez prendre la même approche. Juste windows exécuter plusieurs tâches, chacune responsable d'un proc. Ensuite utiliser un trigger sur la table d'état pour le coup d'envoi de quelque chose lorsque toutes les tâches sont terminées.
UPDATE2:
Aussi, si vous êtes prêt à créer une nouvelle application, vous pouvez de la maison de toute la logique dans un seul fichier exe...
Vous avez besoin de déplacer votre nuit sprocs à l'emploi. Travail SQL Server de contrôle vous permettra de faire tout le calendrier que vous demandez.
Vous voudrez peut-être regarder dans l'aide de DTS (qui peut être exécuté à partir de l'Agent SQL comme job). Il vous permettra de vous être assez bon contrôle sur les procédures stockées besoin d'attendre les autres pour finir, et ce qui peut s'exécuter en parallèle. Vous pouvez également exécuter le package DTS comme un EXE à partir de votre propre logiciel de planification en cas de besoin.
REMARQUE: Vous devez créer plusieurs copies de vos objets de connexion pour autoriser les appels à exécuter en parallèle. Deux appels en utilisant la même connexion de l'objet encore de bloquer les uns les autres, même si vous n'avez pas explicitement mis dans une dépendance.