it-swarm.com.de

Wie verbessert die Denormalisierung die Datenbankleistung?

Ich habe viel über die Denormalisierung gehört, die gemacht wurde, um die Leistung bestimmter Anwendungen zu verbessern. Aber ich habe nie versucht, irgendetwas zu tun.

Also, ich bin nur neugierig, welche Stellen in der normalisierten Datenbank die Leistung verschlechtern oder mit anderen Worten: Was sind Denormalisierungsprinzipien?

Wie kann ich diese Technik verwenden, wenn ich die Leistung verbessern muss? 

58
Roman

Denormalisierung ist ein Kompromiss zwischen time-space. Normalisierte Daten benötigen weniger Speicherplatz, erfordern jedoch möglicherweise eine Verknüpfung, um die gewünschte Ergebnismenge zu erstellen, und somit mehr Zeit. Wenn es denormalisiert ist, werden Daten an mehreren Stellen repliziert. Es benötigt dann mehr Platz, aber die gewünschte Ansicht der Daten ist sofort verfügbar. 

Es gibt andere Zeit-Raum-Optimierungen, wie z

  • denormalisierte Sicht
  • vorberechnete Spalten

Wie bei jeder dieser Methoden verbessert dies das Lesen von Daten (weil sie leicht verfügbar sind), aber Aktualisierungsdaten werden teurer (weil Sie die replizierten oder vorberechneten Daten aktualisieren müssen).

69
ewernli

Denormalisierung wird im Allgemeinen für Folgendes verwendet:

  • Vermeiden Sie eine bestimmte Anzahl von Abfragen
  • Entfernen Sie einige Verknüpfungen

Der Grundgedanke der Denormalisierung ist, dass Sie redundante Daten hinzufügen oder gruppieren, um diese Daten leichter erhalten zu können - und dies zu geringeren Kosten. Das ist besser für Aufführungen.


Ein schnelles Beispiel?

  • Betrachten Sie eine "Posts" - und eine "Comments" -Tabelle für ein Blog
    • Für jeden Beitrag gibt es in der Tabelle "Kommentar" mehrere Zeilen
    • Dies bedeutet, dass Sie zum Anzeigen einer Liste von Posts mit der zugehörigen Anzahl von Kommentaren Folgendes benötigen:
      • Führen Sie eine Abfrage aus, um die Beiträge aufzulisten
      • Führen Sie eine Abfrage pro Beitrag aus, um die Anzahl der Kommentare zu zählen (Ja, diese können nur zu einem einzigen zusammengeführt werden, um die Anzahl aller Beiträge gleichzeitig zu erhalten)
      • Was bedeutet mehrere Fragen.
  • Wenn Sie jetzt ein Feld "Anzahl der Kommentare" in die Tabelle "Posts" einfügen:
    • Sie benötigen nur eine Abfrage, um die Beiträge aufzulisten
    • Und keine Notwendigkeit, die Kommentartabelle abzufragen: Die Anzahl der Kommentare ist bereits für die Posts-Tabelle deaktiviert.
    • Und nur eine Abfrage, die ein weiteres Feld zurückgibt, ist besser als mehrere Abfragen.

Nun, es gibt einige Kosten, ja:

  • Erstens kostet dies etwas Platz sowohl auf der Festplatte als auch im Speicher, da Sie einige redundante Informationen haben:
    • Die Anzahl der Kommentare wird in der Tabelle Posts gespeichert
    • Sie können diese Anzahl auch in der Kommentartabelle zählen
  • Zweitens: Jedes Mal, wenn jemand einen Kommentar hinzufügt/entfernt, müssen Sie Folgendes tun:
    • Speichern/löschen Sie den Kommentar natürlich
    • Aktualisieren Sie aber auch die entsprechende Nummer in der Tabelle Posts.
    • Wenn in Ihrem Blog jedoch viel mehr Leute lesen als Kommentare schreiben, ist dies wahrscheinlich nicht so schlimm.
82
Pascal MARTIN

Das Wort "Denormalisieren" führt zu Verwirrung der Designprobleme. Der Versuch, durch Denormalisierung eine Hochleistungsdatenbank zu erhalten, ist wie der Versuch, durch Fahren von New York ans Ziel zu gelangen. Es sagt Ihnen nicht, welchen Weg Sie gehen sollen.

Was Sie brauchen, ist eine gute Designdisziplin, die ein einfaches und solides Design erzeugt, auch wenn dieses Design manchmal mit den Regeln der Normalisierung kollidiert. 

Eine solche Designdisziplin ist das Sternschema. In einem Sternschema dient eine einzige Faktentabelle als Knotenpunkt eines Tabellensterns. Die anderen Tabellen werden Dimensionstabellen genannt und befinden sich am Rand des Schemas. Die Dimensionen sind durch Beziehungen, die wie die Speichen eines Rades aussehen, mit der Faktentabelle verbunden. Sternschema ist im Wesentlichen eine Möglichkeit, mehrdimensionales Design auf eine SQL-Implementierung zu projizieren.

In enger Beziehung zum Sternschema steht das Schneeflockenschema, das etwas komplizierter ist.

Wenn Sie ein gutes Sternschema haben, werden Sie in der Lage sein, eine Vielzahl von Kombinationen Ihrer Daten mit nur einem Drei-Wege-Join zu erstellen, der zwei Dimensionen und eine Faktentabelle umfasst. Darüber hinaus können viele OLAP - Tools Ihr Sternendesign automatisch entschlüsseln. Sie haben die Möglichkeit, mit einem Mausklick, Drilldown und grafischen Analysefunktionen auf Ihre Daten zuzugreifen, ohne weitere Programmierarbeiten vornehmen zu müssen.

Das Design des Sternschemas verstößt gelegentlich gegen die zweite und dritte Normalform, führt jedoch zu mehr Geschwindigkeit und Flexibilität für Berichte und Extrakte. Sie wird am häufigsten in Data Warehouses, Data Marts und Berichtsdatenbanken verwendet. Im Allgemeinen erzielen Sie mit Sternschemas oder anderen auf Retrieval ausgerichteten Designs viel bessere Ergebnisse als mit einer zufälligen "Denormalisierung".

11
Walter Mitty

Die kritischen Punkte beim Denormalisieren sind:

  • Entscheiden, welche Daten dupliziert werden und warum 
  • Planen, wie die Daten synchron gehalten werden
  • Refactoring der Abfragen zur Verwendung der denormalisierten Felder.

Eine der einfachsten Arten der Denormalisierung ist das Ausfüllen eines Identitätsfelds in Tabellen, um einen Join zu vermeiden. Da Identitäten sich niemals ändern sollten, kommt es selten vor, dass die Daten synchron gehalten werden. Beispielsweise füllen wir unsere Client-ID mit mehreren Tabellen auf, da diese häufig vom Client abgefragt werden müssen und nicht notwendigerweise in den Abfragen alle Daten in den Tabellen erforderlich sind, die sich zwischen der Client-Tabelle und der abgefragten Tabelle befinden wenn die Daten vollständig normalisiert wurden. Sie müssen immer noch einen Join durchführen, um den Clientnamen zu erhalten. Dies ist jedoch besser als der Beitritt zu 6 übergeordneten Tabellen, um den Clientnamen abzurufen, wenn dies die einzigen Daten sind, die Sie außerhalb der abfragenden Tabelle benötigen. 

Dies hat jedoch keinen Vorteil, es sei denn, wir haben häufig Abfragen durchgeführt, bei denen Daten aus den dazwischenliegenden Tabellen benötigt wurden.

Eine andere häufige Denormalisierung könnte darin bestehen, anderen Tabellen ein Namensfeld hinzuzufügen. Da Namen von Natur aus änderbar sind, müssen Sie sicherstellen, dass die Namen mit den Triggern synchron bleiben. Wenn Sie sich jedoch nicht 5 Tabellen statt 2 Tabellen anschließen müssen, kann dies die Kosten für die etwas längere Einfügung oder Aktualisierung wert sein.

7
HLGEM

Wenn Sie bestimmte Anforderungen haben (z. B. Berichterstellung usw.), kann dies dazu beitragen, die Datenbank auf verschiedene Weise zu denormalisieren:

  • führen Sie bestimmte Datenduplikationen ein, um sich einige JOINs zu sparen (z. B. füllen Sie bestimmte Informationen in eine Tabelle ein und seien Sie mit doppelten Daten in Ordnung, sodass alle Daten in dieser Tabelle nicht gefunden werden müssen, indem Sie einer anderen Tabelle beitreten)

  • sie können bestimmte Werte vorberechnen und in einer Tabellenspalte speichern, um sie sofort zu berechnen, um die Datenbank abzufragen. Natürlich können diese berechneten Werte mit der Zeit "abgestanden" werden, und Sie müssen sie möglicherweise zu einem bestimmten Zeitpunkt erneut berechnen, aber das Auslesen eines festen Werts ist normalerweise billiger als die Berechnung eines bestimmten Werts (z. B. das Zählen von untergeordneten Zeilen).

Es gibt sicherlich mehr Möglichkeiten, ein Datenbankschema zu denormalisieren, um die Leistung zu verbessern, aber Sie müssen nur wissen, dass Sie sich dabei in gewisser Weise in Schwierigkeiten bringen. Sie müssen sorgfältig die Vor- und Nachteile abwägen - die Leistungsvorteile im Vergleich zu den Problemen, mit denen Sie sich beschäftigen -, wenn Sie diese Entscheidungen treffen.

3
marc_s

Betrachten Sie eine Datenbank mit einer ordnungsgemäß normalisierten Eltern-Kind-Beziehung. 

Nehmen wir an, die Kardinalität beträgt durchschnittlich 2x1. 

Sie haben zwei Tabellen, Parent, mit p row. Kind mit 2x p Reihen.

Die Join-Operation bedeutet für p Elternzeilen, 2x p Kindzeilen müssen gelesen werden. Die Gesamtzahl der gelesenen Zeilen beträgt p + 2x p

Erwägen Sie das Denormalisieren in einer einzelnen Tabelle mit nur den untergeordneten Zeilen 2x p . Die Anzahl der gelesenen Zeilen beträgt 2x p

Weniger Zeilen == weniger physische E/A == schneller.

1
S.Lott

Wie im letzten Abschnitt dieses Artikels,

https://technet.Microsoft.com/de-de/library/aa224786%28v=sql.80%29.aspx

sie könnten die virtuelle Denormalisierung verwenden, bei der Sie Views mit einigen denormalisierten Daten erstellen, um einfachere SQL-Abfragen schneller ausführen zu können, während die zugrunde liegenden Tabellen für schnellere Hinzufügungs-/Aktualisierungsvorgänge normalisiert bleiben (sofern Sie die Views nicht regelmäßig aktualisieren als in Echtzeit). Ich nehme gerade selbst einen Kurs in relationalen Datenbanken, aber nach meiner Lektüre erscheint mir dieser Ansatz logisch.

0
RJCurrie