Frage

ich einige der Forschung in Datenbanken mache, und ich bin an einigen Einschränkungen von relationalen DBs suchen.

Ich erhalte, dass von großen Tabellen verknüpft ist sehr teuer, aber ich bin mir nicht ganz sicher, warum. Was bedeutet das DBMS eine Join-Operation tun müssen, auszuführen, wo der Engpass?
Wie kann Hilfe Denormalisierung diesen Aufwand zu überwinden? Wie gehen andere Optimierungstechniken (Indizierung, zum Beispiel) helfen?

Persönliche Erfahrungen sind willkommen! Wenn Sie vorhaben, Links zu Ressourcen hinzuzufügen, bitte vermeiden Wikipedia. Ich weiß, wo das schon finden.

In diesem Zusammenhang, ich frage mich, über die denormalisierter Ansätze von Cloud-Service-Datenbanken wie BigTable und SimpleDB. Siehe diese Frage .

War es hilfreich?

Lösung

Entnormierung Leistung zu verbessern? Es klingt überzeugend, aber es ist nicht stichhaltig.

Chris Datum, die in Unternehmen mit Dr. Ted Codd der ursprünglichen Befürworter des relationalen Datenmodells war, lief Normalisierung der Gedulds mit falsch informiert Argumente gegen und systematisch abgerissen sie wissenschaftliche Methode: Er bekam große Datenbanken und getestet diese Behauptungen.

Ich glaube, er schrieb es bis in Relational Database Schriften 1988-1991 aber dieses Buch später wurde in Ausgabe gerollt sechs von Einführung in Datenbanksystemen , das ist der endgültige Text auf Datenbanktheorie und Design, in der achten Auflage, wie ich schreibe und wahrscheinlich seit Jahrzehnten in gedruckter Form bleiben. Chris Datum ein Experte auf diesem Gebiet war, als die meisten von uns liefen noch barfuß.

Er stellte fest, dass:

  • Einige von ihnen halten für spezielle Fälle
  • Alle von ihnen nicht für den allgemeinen Gebrauch zu tilgen
  • Alle von ihnen sind deutlich schlechter für andere Sonderfälle

Es kommt alles zurück, um die Größe des zu mildern Workingset. Schließt sich richtig gewählte Schlüssel mit richtig eingestellt Indizes beteiligt sind billig, nicht teuer, weil sie vor dem die Zeilen materialisiert erhebliche Beschneidung des Ergebnisses ermöglichen.

das Ergebnis materialisieren beinhaltet bulk Platte liest, welche der teuerste Aspekt der Übung von einer Größenordnung ist. Durchführen einer Verknüpfung, dagegen erfordert logisch Abruf nur die Tasten . In der Praxis sind nicht einmal die Schlüsselwerte geholt: die Schlüssel-Hash-Werte verwendet werden, für Vergleiche zu kommen, schließt sich die Kosten für den mehrspaltigen Milderung und Reduzierung radikal die Kosten für Joins Stringvergleichen beteiligt sind. Nicht nur, dass wesentlich mehr fit im Cache, gibt es viel weniger Plattenlese zu tun.

Darüber hinaus wird eine gute optimiser der restriktivste Bedingung auswählen und anwenden, bevor es eine Verknüpfung führt, sehr effektiv die hohe Selektivität Nutzung von auf Indizes mit hohen Mächtigkeit verbindet.

Allerdings ist diese Art der Optimierung kann auch auf denormalised Datenbanken angewendet werden, aber die Art von Menschen, die wollen ein Schema der Regel auf denormalise über Mächtigkeit nicht denken, wenn (falls) sie Indizes eingerichtet.

Es ist wichtig, dass die Tabellen-Scans (Prüfung jeder Zeile in einer Tabelle im Laufe der Herstellung einer Verknüpfung) sind selten in der Praxis zu verstehen. Ein Abfrage-Optimierer nur einen Table-Scan wählen, wenn ein oder mehrere der folgenden Merkmale enthalten.

  • Es gibt weniger als 200 Zeilen in der Beziehung (in diesem Fall ein Scan billiger sein wird)
  • Es gibt keine geeigneten Indizes für die Join-Spalten (wenn es sinnvoll ist dann auf diesen Spalten zu verbinden, warum sie indiziert sind nicht wahr? Fix it)
  • Eine Art Zwang erforderlich ist, bevor die Spalten verglichen werden kann (WTF ?! es beheben oder nach Hause gehen) SEE Endnoten für ADO.NET AUSGABE
  • Eines der Argumente des Vergleichs ist ein Ausdruck (kein Index)

Ausführen einer Operation ist teurer als es nicht auf der Bühne. Allerdings Durchführung der falsch Betrieb, in sinnlose Scheibe gezwungen, I / O und dann verwirft die Schlacken vor der Durchführung der Verbindung Sie wirklich brauchen, ist viel teurer. Auch wenn die „falsche“ Operation vorberechnet und Indizes sinnvoll angewandt wurde, bleibt es erhebliche Strafe. Entnormierung vorauszuberechnen ein Join - trotz der Update-Anomalien zur Folge - ist eine Verpflichtung zu einem bestimmten beizutreten. Wenn Sie ein benötigen andere join, dass Engagement kosten wird Sie big .

Wenn jemand will mir daran zu erinnern, dass es eine Welt im Wandel ist, ich glaube, Sie werden feststellen, dass größere Datenmengen auf gruntier Hardware übertreiben nur die Verbreitung der Ergebnisse des Datums.

Für alle, die auf Abrechnungssysteme oder Junk-Mail-Generatoren (dir Scham) arbeiten und entrüstet Hand Tastatur einstellen, mir zu sagen, dass Sie für eine Tatsache, dass denormalisation ist schneller, sorry, aber du bist in einer der besonderen Fällen leben - insbesondere der Fall, wenn Sie verarbeiten alle der Daten in Ordnung. Es ist nicht ein allgemeiner Fall, und Sie ist in Ihrer Strategie gerechtfertigt.

Sie sind nicht gerechtfertigt es falsch zu verallgemeinern. Siehe das Ende der Note für weitere Informationen über geeignete Verwendung von Denormalisation in Data-Warehousing-Szenarien.

Ich würde auch reagieren, wie

  

Joins sind nur kartesische Produkte mit etwas Lipgloss

Was für eine Last von Bollocks. Einschränkungen werden so früh wie möglich angewendet, restriktivsten zuerst. Sie haben die Theorie gelesen, aber Sie haben es nicht verstanden. Joins behandelt als "kartesische Produkte, auf die Prädikate gilt" nur durch die Abfrage-Optimierer. Dies ist eine symbolische Darstellung (eine Normalisierung in der Tat) symbolische Zerlegung zu erleichtern und damit die optimiser all äquivalenten Transformationen produzieren können und ordnen sie durch Kosten und Selektivität, so dass es den besten Abfrage-Plan auswählen kann.

Die einzige Möglichkeit, jemals die Optimierers erhalten ein kartesisches Produkt zu erzeugen, ist zum Scheitern verurteilt, ein Prädikat zu liefern: SELECT * FROM A,B


Notizen


David Aldridge liefert einige wichtige zusätzliche Informationen.

Es ist in der Tat eine Vielzahl von anderen Strategien neben Indizes und Tabellen-Scans und eine moderne Optimierers wird sie alle vor der Herstellung eines Ausführungsplans kosten.

Ein praktischer Ratschlag:. Wenn es als Fremdschlüssel verwendet werden kann, dann indizieren, so dass eine Index-Strategie ist verfügbar zur optimiser

Früher habe ich schlauer sein als der MSSQL Optimierers. Das änderte sich vor zwei Versionen. Nun lehrt es in der Regel ich . Es ist in einem sehr realen Sinne, ein Expertensystem, alle Weisheit vieler sehr klug Leute in einer Domäne kodifiziert geschlossen ausreichend, dass ein regelbasiertes System wirksam ist.


"Bollocks" kann taktlos gewesen. Ich fragte weniger hochmütig zu sein und daran erinnert, dass Mathematik lügt nicht. Das ist wahr, aber nicht alle von den Auswirkungen der mathematischen Modelle sollten unbedingt wörtlich genommen werden. Quadratwurzeln negativer Zahlen sind sehr praktisch, wenn man sorgfältig ihre Absurdität vermeiden Prüfung (Wortspiel dort) und machen verdammt sicher, dass Sie sie alle aufheben, bevor Sie versuchen, Ihre Gleichung zu interpretieren.

Der Grund, dass ich antwortete so war brutal, dass die Aussage, wie sagt formuliert, dass

  

Verbindet sind kartesische Produkte ...

Das kann nicht sein, was gemeint ist, aber es ist , was geschrieben wurde, und es ist kategorisch falsch. Ein kartesisches Produkt ist eine Beziehung. Ein Join ist eine Funktion. Genauer gesagt, ist eine Verknüpfung eine Beziehung Wertfunktion. Mit einem leeren Prädikat wird es ein kartesisches Produkt zu produzieren, und prüfen, ob es funktioniert, so ist eine Richtigkeitsüberprüfung für eine Datenbank-Abfrage-Engine, aber niemand schreibt ungezwungen in der Praxis verbindet, weil sie keinen praktischen Wert außerhalb eines Klassenzimmers haben.

Ich rief dies, weil ich in die alte Falle nicht Leser wollen fallen das Modell verwirrend mit dem Ding modelliert. Ein Modell ist eine Annäherung, gezielt für die bequeme Handhabung vereinfacht.


Der Cut-off für die Auswahl einer Tabelle Scan Join-Strategie zwischen Datenbank-Engines kann variieren. Es zeichnet sich durch eine Reihe von Implementierungsentscheidungen wie Baumknoten Füllfaktor, Schlüssel-Wert-Größe und Feinheiten des Algorithmus betroffen, aber im Großen und Ganzen Hochleistungs Indizierung gesprochen hat eine Ausführungszeit von k log n + c . Das C-Term ist ein fix Gemeinkosten meist die Rüstzeit gemacht, und die Form der Kurve bedeutet, dass Sie nicht bekommen, eine Auszahlung (im Vergleich zu einer linearen Suche) bis n ist in den Hunderten.


Manchmal Denormalisation ist eine gute Idee

Entnormierung ist eine Verpflichtung zu einem bestimmten Strategie verbinden. Wie bereits erwähnt, stört dies mit other Strategien verbinden. Aber wenn man Eimer Speicherplatz, vorhersehbare Muster des Zugangs, und eine Tendenz, viel oder alles zu verarbeiten, dann kann ein Join precomputing sehr lohnen.

Sie können auch in der Regel verwendet die Zugriffspfade Ihren Betrieb herauszufinden und precompute alle für die Zugriffspfade verbindet. Dies ist die Prämisse hinter Data Warehouse, oder zumindest ist es, wenn sie von Menschen gebaut sind, die wissen, warum sie tun, was sie tun, und zwar nicht nur aus Gründen der Buzzword Compliance.

Ein richtig entworfenes Data Warehouse wird periodisch von einem normalisierten Transaktionsverarbeitungssystem durch eine bulk-Transformation erzeugt wird. Diese Trennung der Operationen und Berichtsdatenbanken hat den sehr wünschenswerten Effekt, den Konflikts zwischen OLTP und OLAP-Eliminierung (Online-Transaktionsverarbeitung, dh die Dateneingabe und Online Analytical Processing, dh Reporting).

Ein wichtiger Punkt hierbei ist, dass abgesehen von den regelmäßigen Aktualisierungen, der Data Warehouse ist nur lesen . Dies macht die Frage nach der Aktualisierung Anomalien moot.

Sie machen den Fehler nicht Ihre OLTP-Datenbank von Entnormierung (die Datenbank, auf der die Dateneingabe geschieht). Es könnte schneller für die Abrechnung läuft, aber wenn Sie tun, dass Sie Update Anomalien bekommen. Schon mal versucht, Readers Digest zu stoppen zu bekommen Senden Sie stopfen?

Speicherplatz ist billig in diesen Tagen, so klopfen selbst heraus. Aber Entnormierung ist nur ein Teil der Geschichte für Data Warehouse. Viel größer Performance-Gewinne werden aus vorberechneten gerollten Werte abgeleitet: Monatssummen, diese Art der Sache. Es ist immer über die Reduzierung der Arbeitsseite.


ADO.NET Probleme mit Typ-Mismatches

Angenommen, Sie eine SQL Server-Tabelle eine indexierte Spalte vom Typ varchar haben enthält, und Sie verwenden AddWithValue einen Parameter zu übergeben, eine Abfrage auf dieser Spalte einzuschränken. C # Strings sind Unicode, so dass die abgeleiteten Parametertyp wird NVARCHAR, die VARCHAR nicht übereinstimmt.

VARCHAR NVARCHAR ist eine Erweiterung Umwandlung, so dass es implizit geschieht -. Aber verabschieden, um die Indizierung und viel Glück ausarbeitet, warum


"Zählen Sie die Scheibe Hits" (Rick James)

Wenn alles im RAM zwischengespeichert, sind JOINs eher billig. Das heißt, Normalisierung hat nicht viel Leistungseinbuße .

Wenn ein „normalisiert“ Schema JOINs bewirkt, dass die Platte viel schlagen, aber das äquivalent „denormalized“ Schema würde die Festplatte nicht treffen müssen, dann Denormalisierung gewinnt einen Leistungswettbewerb.

  

Kommentar von den ursprünglichen Autor: Moderne Datenbank-Engines sind sehr gut bei der Organisation Zugang Sequenzierung während Cache-Misses zu minimieren Operationen verbinden. Die oben, während wahr, könnte als Implizieren miscontrued werden, die unbedingt in problematischer Weise teuer auf große Daten verbindet. Dies würde eine schlechte Entscheidungsfindung auf Seiten der unerfahrene Entwickler zu verursachen führen.

Andere Tipps

Was die meisten Kommentatoren nicht zu beachten ist die große Auswahl in einem komplexen RDBMS verfügbaren Methoden kommen von und die denormalisers immer die höheren Kosten von denormalised Datenpflege beschönigen. jeder nicht beitreten basiert auf Indizes und Datenbanken haben viel optimiert algotithms und Methoden zum Verbinden, die reduzieren sollen Kosten kommen.

In jedem Fall sind die Kosten für eine Verknüpfung hängt von seiner Art und ein paar andere Faktoren. Es muss nicht teuer sein -. Beispiele

  • Ein Hash-Join, bei dem den Massendaten equijoined sind, ist sehr billig in der Tat, und die Kosten nur von Bedeutung sein, wenn die Hash-Tabelle im Speicher nicht im Cache gespeichert werden kann. Kein Index erforderlich. Equi-Aufteilung zwischen den verbundenen Datensätzen kann eine große Hilfe sein.
  • Die Kosten einer Art-Mischjoin durch die Kosten der Art anstatt der Zusammenführung angetrieben wird -. Eine indexbasierte Zugriffsmethode praktisch eliminieren können die Kosten für die Art
  • Die Kosten einer verschachtelten Schleife auf einem Index kommen wird durch die Höhe der B-Baum-Index und den Zugang des Tabellenblock selbst angetrieben. Es ist schnell, aber nicht geeignet für Massen verbinden.
  • Eine verschachtelte Schleife auf einem Cluster-Join basiert viel billiger, mit weniger Logisches IOs pro beitreten erforderlich Reihe -., Wenn die verknüpften Tabellen beide dann in demselben Cluster befinden kommen die durch die Colocation von verknüpften Zeilen sehr billig wird

Datenbanken sind so konzipiert, verbinden, und sie sind sehr flexibel, wie sie es tun, und in der Regel sehr performant, wenn sie nicht den Mechanismus falsch beitreten zu bekommen.

Ich denke, die ganze Frage auf einer falschen Prämisse beruht. Joins auf große Tische sind nicht unbedingt teuer sein. In der Tat, tun verbindet effizient ist einer der Hauptgründe, relationale Datenbanken existieren überhaupt. Stattdessen tritt auf großen Sätze oft teuer sind, aber sehr selten tun Sie den gesamten Inhalt der großen Tabelle A mit dem gesamten Inhalt der großen Tabelle B. teilnehmen möchten, schreiben Sie die Abfrage, so dass nur die wichtigen Zeilen jede Tabelle verwendet werden und die aktuelle Menge von der Join gehalten kleiner bleibt.

Darüber hinaus haben Sie die Effizienz von Peter Wone erwähnt, so dass nur die wichtigen Teile jeden Datensatz im Speicher sein muss, bis die endgültige Ergebnismenge materialisiert. Auch in großen Abfragen mit vielen verbindet Sie in der Regel mit den kleineren Tischsets beginnen möchten und arbeiten Sie sich zu den großen, nach oben, so dass der Satz im Speicher gehalten, so klein wie möglich, so lange wie möglich bleibt.

Wenn es richtig gemacht, schließt sich in der Regel die besten vergleichen, kombinieren oder Filter auf große Datenmengen.

Der Engpass ist ziemlich viel immer Disk-I / O und noch spezieller - Zufall Disk-I / O (zum Vergleich: sequentielles Lesen ist ziemlich schnell und kann mit Read-Ahead-Strategien im Cache gespeichert werden).

Verbindet können erhöhen zufällig sucht - wenn Sie springen um kleine Teile eines großen Tisch zu lesen. Aber Abfrage-Optimierer sucht das und wird es in einen sequenziellen Table Scan drehen (die nicht benötigten Zeilen zu verwerfen), wenn sie meint, dass wäre besser.

Eine einzelne normalisierte Tabelle hat ein ähnliches Problem - die Zeilen sind groß, und so weniger fit auf einer einzelnen Datenseite. Wenn Sie Zeilen benötigen, die weit von einem anderen (und die große Reihe Größe macht sie weiter voneinander entfernt) befinden sich dann werden Sie mehr zufällige I / O haben. Auch hier kann ein Tabellenscan dies zu vermeiden gezwungen werden. Aber dieses Mal hat Ihre Tabellen-Scan wegen der großen Zeilengröße mehr Daten zu lesen. Hinzu kommt, dass die Tatsache, dass Sie das Kopieren von Daten von einem einzigen Standort auf mehrere Standorte und die RDBMS hat so viel mehr zu lesen (und Cache).

Mit 2 Tabellen, Sie erhalten auch 2 Clustered-Indizes - und können in der Regel Index mehr (wegen weniger insert / update-Overhead), die Sie drastisch erhöhte Leistung erhalten kann (vor allem, wieder, weil Indizes sind (relativ) kleine, schnell zu abzulesen Festplatte (oder billig Cache), und verringert die Menge der Tabellenzeilen Sie von der Festplatte lesen müssen).

über die einzige Overhead mit einem Join kommt aus Bezifferung der passenden Zeilen aus. SQL Server verwenden drei verschiedene Arten von Verknüpfungen, hauptsächlich basierend auf Daten-Set Größen passende Zeilen zu finden. Wenn der Optimierer den falschen Join-Typen (aufgrund ungenauer Statistiken, unzureichender Indizes oder nur einen Optimierer Bug oder Kantenfall) nimmt drastisch Abfragezeiten beeinflussen kann.

  • Eine Schleife verbinden ist farily billig für (mindestens 1) kleine Datenmenge.
  • Ein Merge-Join erfordert eine Art beiden Datensätze zuerst. Wenn Sie auf einer indizierten Spalte verbinden, obwohl, dann ist der Index bereits sortiert und keine weitere Arbeit getan werden muss. Ansonsten gibt es einige CPU und Speicher-Overhead bei der Sortierung.
  • Die Hash-Join erfordert sowohl Speicher (die Hash-Tabelle zu speichern) und CPU (den Hash zu bauen). Auch dies ist ziemlich schnell in Bezug auf das Disk-I / O. Jedoch , wenn es nicht genügend RAM ist die Hash-Tabelle zu speichern, wird SQL Server tempdb verwenden Teile der Hash-Tabelle zu speichern und die gefundenen Zeilen, und dann auch nur Teile der Hash-Tabelle zu einer Zeit zu verarbeiten. Wie bei allen Dingen Platte, das ist ziemlich langsam.

Im optimalen Fall, diese verursachen keine Disk-I / O - und sind so unbedeutend aus Sicht der Leistung.

Alles in allem, im schlimmsten Fall - es sollte eigentlich schneller sein, um die gleiche Menge an lesen logische Daten von x verknüpften Tabellen, wie sie aus einer einzigen denormalisierter Tabelle sind wegen der kleinere Platte liest. Um die gleiche Menge an physischen zu lesen Daten, könnte es einige geringfügige Kopf sein.

Da Abfragezeit in der Regel von I / O-Kosten dominiert wird, und die Größe Ihrer Daten nicht ändert (minus einig sehr winzige Zeile Overhead) mit Denormalisierung, gibt es nicht eine enorme Menge an Nutzen von nur verschmelzenden Tabellen zusammen werden mußte . Die Art der Denormalisierung, die Leistung zu erhöhen neigt, IME wird Caching-Werte berechnet, anstatt die 10.000 Zeilen zu lesen, benötigt, um sie zu berechnen.

Die Reihenfolge, in der die Tabellen sind Beitritt ist extrem wichtig. Wenn Sie zwei Sätze von Daten versuchen, die Abfrage in einer Art und Weise zu bauen, so wird die kleinste zuerst die Datenmenge zu reduzieren, verwendet werden, die Abfrage zu arbeiten hat.

Für einige Datenbanken ist es nicht, zum Beispiel MS SQL keine Rolle spielt kennen den richtigen Reihenfolge kommen die meiste Zeit. Für einige (wie IBM Informix) macht den Arbeits den Unterschied.

Die Entscheidung, ob denormalize oder normalisieren ist ziemlich ein einfacher Prozess, wenn Sie die Komplexitätsklasse der Verbindung prüfen. Zum Beispiel neigen ich meine Datenbanken mit Normalisierung zu gestalten, wenn die Abfragen O (k log n) sind, wobei k auf die gewünschte Ausgangsgröße relativ ist.

Eine einfache Möglichkeit, die Leistung zu denormalize und zu optimieren ist, wie Änderungen an Ihrer normalisieren Struktur zu denken, Ihre denormalisierter Struktur beeinflussen. Es kann jedoch problematisch sein, da es Transaktionslogik erfordern strukturiert auf einer Denormalisierte zu arbeiten.

Die Debatte zur Normalisierung und Denormalisierung ist nicht zu Ende gehen, da die Probleme sind enorm. Es gibt viele Probleme, wo die natürliche Lösung, die beiden Ansätze erfordert.

In der Regel habe ich eine normalisierte Struktur immer gespeichert und denormalized Caches, die rekonstruiert werden kann. Schließlich diese Caches meinen Arsch retten die zukünftige Normalisierung Probleme zu lösen.

Ausarbeitung, was andere gesagt haben,

Joins sind nur kartesische Produkte mit etwas Lipgloss. {1,2,3,4} X {1,2,3} ergäbe 12 Kombinationen (n × n = n ^ 2). Dieser berechnete Satz wirkt als Referenz, auf die Bedingungen angewendet werden. Das DBMS gilt die Bedingungen (wie, wo links und rechts sind 2 oder 3) uns die Anpassungsbedingung zu geben (s). Eigentlich ist es mehr optimiert, aber das Problem ist das gleiche. Die Änderungen der Größe der Sätze das Ergebnis Größe exponentiell erhöhen würde. Die Menge an Speicher und CPU-Zyklen verbraucht alle in exponentieller Bedingungen abgewickelt werden.

Wenn wir denormalise vermeiden wir diese Berechnung insgesamt, denke eine farbige klebrig zu haben, auf jeder Seite Ihres Buches angebracht. Sie können die Informationen mit aus ableiten, eine Referenz. Die Strafe zahlen wir, dass wir das Wesen des DBMS (optimale Organisation der Daten) zu beeinträchtigen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top