Transaktions- und Berichtsdatenbanken - Wie?

8

Beim Erstellen eines Transaktionssystems mit einer stark normalisierten Datenbank können beim Ausführen von Berichtsstilabfragen oder sogar Abfragen zum Anzeigen von Daten auf einer Benutzeroberfläche mehrere Verknüpfungen verwendet werden, was in einem datenintensiven Szenario die Leistung beeinträchtigen kann. Joins sind teuer.

Häufig wird empfohlen, dass Sie diese Abfragen nicht von Ihrem transaktionalen DB-Modell aus ausführen sollten. Stattdessen sollten Sie ein denormalisiertes, abgeflachtes Modell verwenden, das auf bestimmte Benutzeroberflächenansichten oder Berichte zugeschnitten ist und viele Joins überflüssig macht. Die Duplizierung von Daten ist in diesem Szenario kein Problem.

Dieses Konzept macht durchaus Sinn, aber was ich selten sehe, wenn Experten diese Aussagen machen, ist genau, wie man das implementiert. Zum Beispiel (und ehrlich gesagt würde ich ein Beispiel mit einer beliebigen Plattform zu schätzen wissen) in einem mittelgroßen System, das auf einem SQL-Server-Backend läuft, haben Sie ein normalisiertes Transaktionsmodell. Sie haben auch einige Berichte und eine Website, die Abfragen erfordern. So erstellen Sie eine "Reporting" -Datenbank, die die normalisierten Daten flacht. Wie halten Sie das synchron? Transaktionsprotokollversand? Wenn ja, wie transformieren Sie die Daten in das Berichtsmodell?

    
Saraz 06.10.2010, 13:33
quelle

5 Antworten

3

In unserem Shop haben wir eine kontinuierliche Transaktionsreplikation aus dem OLTP-System zu einem anderen nach oben DB-Server für die Berichterstellung. Sie würden nicht den Protokollversand verwenden zu diesem Zweck wollen, da es eine exklusive Sperre für die Datenbank wieder her jedes Mal, erfordert es ein Protokoll, das den Benutzer von der Erstellung von Berichten verhindern würde.

Mit dem Optimierer in SQL Server heute, denke ich, die Vorstellung, dass die auf einer normalisierten Datenbank Joins „zu teuer“ für die Berichterstattung etwas veraltet ist. Unser Design ist vollständig in der 3. Normalform, mehrere Millionen Zeilen in unseren Haupttabellen, und wir haben keine Probleme, einen unserer Berichte auszuführen. Having said that, wenn es hart auf hart kam, Sie in die Schaffung einige indizierte Sichten aussehen könnte auf Ihrem Berichtsserver zu helfen.

    
Joe Stefanelli 06.10.2010, 14:06
quelle
0

Wir verwenden Transaktionsreplikation zu einer anderen Datenbank.

Wir filtern die Daten so, dass wir nur die Daten erhalten, die wir in unserer Replikationsdatenbank benötigen

Wir wählen auch nur die Spalten, die wir wollen, also sind die Tabellen 'kleiner'.

Dann kombinieren wir die Daten in der Replikationsdatenbank entweder über Ansichten oder wir erstellen Trigger, um Daten von einer Tabelle zur anderen hinzuzufügen.

    
Michel 06.10.2010 14:18
quelle
0

Die richtige Indexierung, das Abdecken von Indizes und das Neuformatieren von Abfragen könnte Ihnen wahrscheinlich sehr gut tun. Wenn Sie dies jedoch bereits tun, können Sie entweder Ihre Datenbanken spiegeln, sie replizieren oder ein ETL-Paket erstellen und einen Analysedienst-Cube / s erstellen.

    
DForck42 06.10.2010 19:38
quelle
0

Eingespeicherte Antwort :

In allzu vielen Fällen kann eine indizierte Sicht Ihre kurzfristigen Leistungsziele lösen, wird aber zu einem späteren Zeitpunkt kontraproduktiv. Wenn Sie sich für eine indizierte Sicht entscheiden, benötigen Sie möglicherweise eine Exit-Strategie. Lassen Sie mich ein paar häufige Probleme mit indizierten Sichten beschreiben.

Indizierte Ansichten können die Sperrenkonflikte erhöhen.

Es ist sehr einfach zu demonstrieren. Erstellen Sie die folgende Tabelle:

%Vor%

Führen Sie auf einer Registerkarte in SSMS das folgende Skript aus:

%Vor%

Führen Sie auf einer anderen Registerkarte eine ähnliche aus:

%Vor%

Beachten Sie, dass beide Einfügungen abgeschlossen sind, sie blockieren sich nicht gegenseitig. Rollback in beiden Registerkarten und erstellen Sie eine indizierte Sicht:

%Vor%

Führen Sie die zwei Inserts erneut aus. Beachten Sie, dass der zweite nicht abgeschlossen wird; Es ist blockiert. Der Grund ist sehr einfach: Die erste Einfügung ändert den entsprechenden Eintrag in der indizierten Sicht, so dass die Einfügung eine Sperre erhält und hält.

Es ist genauso einfach zu demonstrieren, dass beim Erstellen einer indizierten Sicht möglicherweise auch Deadlocks wahrscheinlicher werden.

Hinweis: Dies ist kein Problem bei der Implementierung indizierter Sichten. Wenn Sie eine eigene Übersichtstabelle einrichten und Trigger entwickeln, die sie direkt ändern, um sie auf dem neuesten Stand zu halten, werden Sie auf dasselbe Problem stoßen. Nur wenn Sie Ihre Übersichtstabelle nicht ständig pflegen, können Sie dieses Sperrproblem umgehen, aber eine ausführlichere Diskussion darüber würde den Rahmen dieses Beitrags sprengen.

Bearbeiten: Das Beispiel mag für Sie künstlich aussehen, aber das Problem, das es zeigt, ist sehr real und sehr häufig. Indizierte Sichten in OLTP-Umgebungen sind von begrenztem Nutzen, da sie die Sperrkonflikte erheblich erhöhen und viele Deadlocks verursachen. Es ist ziemlich üblich, dass jemand sie in OLTP erstellt, aber schließlich abfällt, weil sie mehr Probleme einführen, als sie lösen.

Es gibt zwei gebräuchliche Methoden, um Probleme zu demonstrieren, die durch Parallelität verursacht werden: Entweder schreiben wir Schleifen und führen sie aus mehreren Verbindungen aus oder starten explizit Transaktionen in zwei oder mehr Verbindungen. Ich ermutige jeden dazu, einen einfacheren Weg zu finden, dieses Problem zu demonstrieren.

    
A-K 06.10.2010 17:21
quelle
-1

Kurze Antwort: Versuchen Sie, mit indizierten Sichten zu arbeiten. Die zugrunde liegenden Tabellen unterliegen einer Reihe von Einschränkungen, Sie erhalten jedoch sofort eine Synchronisierung.

    
Noel Abrahams 06.10.2010 14:05
quelle

Tags und Links