Unsere SQL Sever 2008-Anwendungsdatenbank wird von Server A auf Server B repliziert (Push-Replikation). Wir verwenden die Kopie, nennen wir sie database_b, auf Server B, um Berichte zu erstellen und andere Abfragen auszuführen, damit unsere Berichte die Anwendung nicht beeinträchtigen. Derzeit nutzen wir ineffiziente Ansichten, um Daten in mehreren Tabellen in database_b zu kombinieren, damit das Verfassen von Berichten für unsere Berichtsersteller (die über grundlegende SQL-Kenntnisse verfügen) vereinfacht wird.
99,9% der Datenbankaktivität sind INSERTS. Daher suchen wir nach einer Möglichkeit, die ineffizienten Ansichten durch Tabellen zu ersetzen, die wir optimieren können. Hier ist ein vereinfachtes Beispiel:
Es gibt eine appointment
Tabelle und eine location
(Nachschlagetabelle). Jedes Mal, wenn ein neuer Termin geplant ist, wird der appointment
Tabelle eine Zeile hinzugefügt . Jedes Mal, wenn dieses EINFÜGEN passiert, möchte ich das appointment_id
und den entsprechenden Standortnamen ( location_id
aus beiden Tabellen verbinden) in eine Berichtstabelle einfügen .
Ich habe dies mit einem Trigger in der Termintabelle in database_b auf Server B erreicht.
Meine Frage ist - gibt es besondere Überlegungen, da database_b eine replizierte Kopie ist? Muss ich mir Sorgen machen, dass ein fehlerhafter Trigger den gesamten (Push-) Replikationsprozess durcheinander bringt? Fehlt mir noch etwas?
Leider ist es schwierig, dies in unserer Entwicklungsumgebung zu testen, so dass ich nicht die Möglichkeit habe, viel zu probieren.
Antworten:
Dies klingt nach einer großartigen Situation, um indizierte Ansichten zu verwenden. Das klingt so ziemlich so: Eine Ansicht, die ihre Ergebnisse physisch in der Datenbank speichert und automatisch aktualisiert wird, wenn die Basistabellen aktualisiert werden.
Ein paar Vorsichtsmaßnahmen:
Dieser Artikel enthält (viel) weitere Details sowie ein schönes Beispiel für die Verwendung der AdventureWorks-Datenbank:
http://msdn.microsoft.com/en-us/library/ms191432%28v=sql.100%29.aspx
Wenn es sich um eine relativ einfache Abfrage handelt, die aufgrund vieler Daten und (innerer) Verknüpfungen nur eine schlechte Leistung erbringt, kann dies eine einfache Möglichkeit sein, sie zu verbessern.
quelle
Ich schlage vor, dass Sie die folgenden Optionen prüfen, falls Sie dies noch nicht getan haben
Weitergabe durch benutzerdefinierte gespeicherte Prozeduren. Sie könnten die Triggerlogik in diesem benutzerdefinierten Prozess haben. Der Nachteil ist jedoch, dass Ihr Abonnent und Ihr Publisher miteinander verbunden sind. http://msdn.microsoft.com/en-us/library/ms147880(v=sql.105).aspx
Geben Sie an, dass die Änderung mit einer INSERT-, UPDATE- oder DELETE-Anweisung weitergegeben werden soll, und geben Sie den Auslöser an.
Diese Option kann die Replikation beschleunigen, wenn mehrere Zeilen mit einer einzigen Anweisung aktualisiert / eingefügt werden.
quelle