Asynchrone Déclenche dans SQL Server 2005/2008
J'ai déclencheurs de manipuler et d'insérer un grand nombre de données dans un le suivi des modifications tableau à des fins de vérification sur tous les insert, update et delete.
Ce déclencheur fait son travail très bien, en l'utilisant, nous sommes en mesure de vous connecter souhaité oldvalues/newvalues selon les besoins de l'entreprise pour chaque transaction.
Cependant dans certains les cas où la table source a beaucoup de colonnes, il peut prendre jusqu'à 30 secondes de la transaction qui est inacceptable.
Est-il un moyen pour que le déclencheur s'exécute de façon asynchrone? Des exemples.
- Le suivi des modifications est une fonctionnalité intégrée btw 🙂 msdn.microsoft.com/en-us/library/bb933874.aspx
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire le déclencheur s'exécute de façon asynchrone, mais vous pourriez avoir le déclencheur synchrone envoyez un message à un SQL Service Broker file d'attente. La file d'attente peut alors être traité de manière asynchrone par une procédure stockée.
ces articles montrent comment utiliser le service broker pour async d'audit et devrait être utile:
Centralisée Asynchrone de Vérification avec le Service Broker
Service Broker goodies: inter-Serveur Beaucoup à une (Un à Plusieurs) scénario et Comment le résoudre
SQL Server 2014 introduit une fonction très intéressante appelée Retard De La Durabilité. Si vous pouvez tolérer de perdre quelques lignes dans le cas d'un événement catastrophique, comme un crash du serveur, vous pourriez vraiment augmenter votre performance dans schenarios comme la vôtre.
La base de données contenant la table doit d'abord être modifiée pour permettre retard de la durabilité.
Alors vous pouvez contrôler la durabilité par transaction.
La transaction sera engagé comme durable si la transaction est de la croix-base de données, donc cela ne fonctionnera que si votre table d'audit est situé dans la même base de données que le déclencheur.
Il est également possible de modifier la base de données forcé au lieu de permis. Cela provoque toutes les transactions dans la base de données risque d'être retardé durable.
Cette étrange défaut, nous l'espérons être résolu dans une version ultérieure, mais jusqu'alors, il peut être sage de faire en sorte d'exécuter automatiquement le " sp_flush_log procédure lorsque SQL server est le redémarrage ou l'arrêt.
Je me demande si vous pourriez marquer un record pour le suivi des modifications par l'insertion, dans un "trop" processus de table, y compris qui ont fait le changement, etc, etc.
Puis un autre processus pourrait venir le long et copie le reste des données sur une base régulière.
Il y a un conflit entre le "fait son travail très bien" et "inacceptable", évidemment.
Il me semble que vous êtes en train d'utiliser des déclencheurs de la même manière que vous utiliseriez des événements dans un OO procédure de demande, ce qui à mon humble avis n'a pas de carte.
J'appellerais un des déclencheurs de la logique qui prend 30 secondes - non, plus que 0,1 seconde - comme disfunctional. Je pense que vous avez vraiment besoin de refonte de votre fonctionnalité et de le faire d'une autre manière. Je dirais "si vous voulez vous rendre asynchrone", mais je ne pense pas que cette conception a de sens que dans n'importe quelle forme.
Autant que "asynchrone déclencheurs", la base fondamentale des conflits, c'est que vous pourriez ne jamais inclure une telle chose entre BEGIN TRAN et COMMIT TRAN états parce que vous avez perdu la trace de savoir si elle a réussi ou non.
Créer la table d'historique(s). Pendant la mise à jour (/suppression/insertion) de la table principale, insérer les valeurs de l'enregistrement (supprimé pseudo-tableau de déclenchement) dans l'histoire de la table; quelques informations supplémentaires est nécessaire de trop (timestamp, le type d'opération, peut-être que le contexte de l'utilisateur). De nouvelles valeurs sont conservées vivantes dans le tableau de toute façon.
De cette façon, déclenche une course rapide(er) et vous pouvez passer opérations lentes de la visionneuse de journaux (procédure).
Pour effectuer le traitement asynchrone, vous pouvez utiliser le Service de Courtier, mais ce n'est pas la seule option, vous pouvez également utiliser des objets CLR.
Ce qui suit est un exemple d'une procédure stockée (AsyncProcedure) que des appels asynchrones d'une autre procédure (SyncProcedure):
Il utilise asynchrone délégués pour appeler SyncProcedure:
Exemple de l'appel AsyncProcedure:
Malheureusement, le montage nécessite l'autorisation UNSAFE.
Pas que je sache, mais êtes-vous d'insérer les valeurs dans la table d'Audit qui existent aussi dans la table de base? Si oui, vous pourriez envisager de suivi seulement les changements. Par conséquent, un insert de la piste le temps de changement, de l'utilisateur, supplémentaire et un tas de valeurs Null (en effet, l'avant de la valeur). Une mise à jour aurait le temps de changement d'utilisateur, etc et de l'avant la valeur de la modification de la colonne. Un supprimer a du changement, etc, et toutes les valeurs.
Aussi, avez-vous un audit de la table par table de base ou d'une vérification de la table de la DB? Bien sûr, le plus tard peut plus facilement dans les attend chaque transaction essaie d'écrire dans une table.
Je soupçonne que votre déclencheur de ces csv générique/texte de générer des déclencheurs conçu pour enregistrer toutes les modifications de la table en un seul endroit. Bon en théorie (peut-être...), mais difficile à tenir et à utiliser dans la pratique.
Si vous pouviez exécuter de manière asynchrone (ce qui serait encore besoin de stocker des données quelque part pour l'enregistrement de nouveau plus tard), alors vous n'êtes pas d'audit et de n'avoir de l'histoire à utiliser.
Vous pourriez peut-être regarder le déclenchement du plan d'exécution et de voir ce bit est de prendre le plus de temps?
Pouvez-vous modifier le mode de vérification, de dire, de par table? Vous pourriez diviser le journal actuel des données dans les tableaux correspondants.