web-dev-qa-db-fra.com

Considérations lorsque vous utilisez des déclencheurs sur une base de données répliquée (cible)

Notre base de données d'applications SQL Sever 2008 est répliquée de serveur A au serveur B (réplication PUSH). Nous utilisons la copie, appelons-la base de données_b, sur le serveur B pour créer des rapports et exécuter d'autres requêtes afin que nos rapports n'interfèrent pas avec l'application. Actuellement, nous tirons parti des vues inefficaces pour combiner des données sur plusieurs tables dans la base de données_B afin que la rédaction de rapports soit simplifiée pour nos écrivains de rapport (qui ont des compétences de base SQL).

99,9% de l'activité de la base de données est des insertions, nous explorons donc un moyen de remplacer les vues inefficaces avec des tables que nous pouvons optimiser. Voici un exemple simplifié:

Il y a une table appointment et une table location (recherche). Chaque fois qu'un nouveau rendez-vous est planifié, une ligne est ajoutée à la table appointment. Chaque fois que cet insert arrive, je veux prendre ça appointment_id et insérez-le et son nom de localisation correspondant (Joignez-vous à location_id des deux tables) dans une table de rapport.

Je l'ai accompli avec une gâchette sur la table de rendez-vous dans la base de données_b sur le serveur B.

Ma question est - y a-t-il des considérations particulières que la base de données_b est une copie répliquée? Dois-je vous soucier d'une gâchette défaillante qui vous échappe tout le processus de réplication (poussée)? Quelque chose d'autre que je manque?

Malheureusement, il est difficile de tester cela dans notre environnement de développement, alors je n'ai pas l'occasion de beaucoup d'essais et d'erreurs.

7
JHFB

Cela ressemble à une grande situation pour utiliser des vues indexées. Ce sont à peu près ce qu'ils ressemblent: une vue qui stocke physiquement ses résultats dans la base de données et est mise à jour automatiquement lorsque les tables de base sont mises à jour.

Quelques mises en garde:

  • Avoir beaucoup d'entre eux dans votre base de données d'abonnement pourrait ralentir la réplication (mais pourrait donc beaucoup de déclencheurs).
  • Vous devez modifier certaines options définies strictes pour les créer et vous devez utiliser avec le schéma lors de la création de la vue.
  • Il y a des exigences strictes supplémentaires sur ce qui peut être à votre avis. Par exemple, vous ne pouvez pas utiliser de jointures extérieures, d'agrégats ou d'applications croisées/extérieures.
  • Si vous utilisez Standard Edition, vous devez interroger la vue par nom en utilisant l'indice (noexpand). SQL Server n'utilisera pas automatiquement la vue si vous essayez d'interroger ses tables de base.

Il y a (beaucoup) plus de détails dans cet article, ainsi qu'un bon exemple utilisant la base de données AdventureWorks:
[.____] http://msdn.microsoft.com/en-us/library/ms191432%28V=SQL.100%29.aspx

Si c'est une requête relativement simple qui n'effectue que peu de choses à cause de nombreuses données et jointures (intérieures), cela pourrait être un moyen facile de l'améliorer.

6
db2

Je vous suggère d'explorer les options suivantes si vous ne l'avez pas déjà fait

  1. Propagation par des procédures stockées personnalisées. Vous pouvez avoir la logique de déclenchement dans ce processus personnalisé. Mais l'inconvénient est votre abonné et votre éditeur sont couplés. http://msdn.microsoft.com/en-us/library/ms1478880 (v = SQL.105) .aspx

  2. Spécifiez que la modification doit être propagée à l'aide d'une instruction Insert, Mettre à jour ou Supprimer et avoir la gâchette.

Cette option peut accélérer la réplication si plusieurs lignes sont mises à jour/insérées avec une seule déclaration.

0
Afroz