Frage Warum sind Joins schlecht, wenn man die Skalierbarkeit berücksichtigt?


Warum sind Joins schlecht oder "langsam"? Ich weiß, dass ich das mehr als einmal gehört habe. Ich habe dieses Zitat gefunden

Das Problem ist, dass Joins relativ sind   langsam, besonders bei sehr großen Datenmengen   Sets, und wenn sie langsam sind   Website ist langsam. Es braucht viel Zeit   um all diese einzelnen Bits von zu bekommen   Informationen von der Festplatte und legte sie alle   wieder zusammen.

Quelle

Ich dachte immer, sie wären schnell, besonders wenn man einen PK nachschaut. Warum sind sie "langsam"?


76
2018-04-12 17:02


Ursprung


Antworten:


Das Verbinden von zwei separaten Datenquellen ist relativ langsam, zumindest verglichen mit dem Nicht-Beitritt. Aber denken Sie daran, dass die Alternative darin besteht, keine zwei separaten Daten mehr zu haben. Sie müssen die zwei unterschiedlichen Datenpunkte in den gleichen Datensatz einfügen. Sie können nicht zwei verschiedene Daten kombinieren, ohne dass es irgendwo eine Konsequenz gibt. Stellen Sie also sicher, dass Sie den Kompromiss verstehen.

Die gute Nachricht ist, dass moderne relationale Datenbanken sind gut bei Joins. Sie sollten Joins nicht als langsam mit einer guten Datenbank betrachten. Die Datenbank bietet eine Reihe von Möglichkeiten, um rohe Verknüpfungen aufzunehmen und zu erstellen viel schneller:

  • Verknüpfen Sie einen Ersatzschlüssel (Autonummer / Identitätsspalte) anstelle eines natürlichen Schlüssels. Dies bedeutet kleinere (und daher schnellere) Vergleiche während der Join-Operation
  • Indizes
  • Materialisierte / indizierte Sichten (Betrachten Sie dies als vorberechneten Join oder gelang es De-Normalisierung)
  • Berechnete Spalte. Sie können dies verwenden, um die Schlüsselspalten eines Join zu hashen oder auf andere Weise vorzuberechnen, so dass ein komplexer Vergleich für einen Join jetzt viel kleiner und potenziell vorindiziert ist.
  • Tabellenpartitionen (hilft bei großen Datenmengen, indem die Last auf mehrere Festplatten verteilt wird, oder bei der Einschränkung, was eine Tabellensuche bis zu einem Partitions-Scan hätte sein können)
  • OLAP (pre-computes Ergebnisse bestimmter Arten von Abfragen / Joins. Es ist nicht ganz richtig, aber Sie können sich das vorstellen als generisch Denormalisierung)

Ich würde so weit gehen, das zu sagen Der Hauptgrund dafür, dass relationale Datenbanken überhaupt existieren, besteht darin, dass Sie Joins effizient ausführen können*. Es ist sicherlich nicht nur strukturierte Daten zu speichern (Sie könnten das mit flachen Dateikonstrukten wie csv oder xml tun). Mit einigen der aufgeführten Optionen können Sie Ihren Join sogar vollständig im Voraus erstellen, so dass die Ergebnisse bereits vor dem Absetzen der Abfrage vorliegen - als ob Sie die Daten denormalisiert hätten (allerdings auf Kosten von langsameren Schreibvorgängen).

Wenn Sie einen langsamen Join haben, verwenden Sie Ihre Datenbank wahrscheinlich nicht korrekt. 

Die De-Normalisierung sollte erst durchgeführt werden, nachdem diese anderen Techniken versagt haben. Und die einzige Möglichkeit, "Versagen" wirklich zu beurteilen, besteht darin, sinnvolle Leistungsziele zu setzen und diese Ziele zu messen. Wenn Sie nicht gemessen haben, ist es zu früh, um überhaupt über eine Normalisierung nachzudenken.

* Das heißt, sie existieren als Entitäten, die sich von bloßen Tabellensammlungen unterscheiden. Ein weiterer Grund für ein echtes RDBMS ist der sichere gleichzeitige Zugriff.


76
2018-04-12 17:23



Joins können sein Langsamer als sie durch De-Normalisierung zu vermeiden, aber wenn sie richtig verwendet werden (Verbindung zu Spalten mit entsprechenden Indizes und so weiter) Sie sind nicht von Natur aus langsam.

De-Normalisierung ist eine von vielen Optimierungstechniken, die Sie berücksichtigen können, wenn Ihr gut gestaltetes Datenbankschema Leistungsprobleme aufweist.


28
2018-04-12 17:11



Artikel sagt, dass sie im Vergleich zu fehlenden Verbindungen langsam sind. Dies kann durch Denormalisierung erreicht werden. Es gibt also einen Kompromiss zwischen Geschwindigkeit und Normalisierung. Vergiss die vorzeitige Optimierung auch nicht :)


12
2018-04-12 17:08



Zuallererst ist der Daseinsgrund einer relationalen Datenbank das Modellieren von Beziehungen zwischen Entitäten. Joins sind einfach die Mechanismen, durch die wir diese Beziehungen durchqueren. Sie kommen zwar zu einem geringen Preis, aber ohne Joins gibt es wirklich keinen Grund für eine relationale Datenbank.

In der akademischen Welt lernen wir Dinge wie die verschiedenen normalen Formen (1., 2., 3., Boyce-Codd, usw.), und wir lernen verschiedene Arten von Schlüsseln (primär, fremd, alternativ, einzigartig usw.) und wie Diese Dinge passen zusammen, um eine Datenbank zu entwerfen. Und wir lernen die Grundlagen von SQL sowie die Manipulation von Struktur und Daten (DDL & DML).

In der Unternehmenswelt erweisen sich viele akademische Konstrukte als wesentlich weniger lebensfähig, als wir glauben konnten. Ein perfektes Beispiel ist die Vorstellung eines Primärschlüssels. Akademisch ist es dieses Attribut (oder die Sammlung von Attributen), das eine Zeile in der Tabelle eindeutig identifiziert. In vielen Problembereichen ist der richtige akademische Primärschlüssel eine Zusammensetzung aus 3 oder 4 Attributen. Fast jeder in der modernen Unternehmenswelt verwendet jedoch eine automatisch generierte, sequentielle Ganzzahl als Primärschlüssel einer Tabelle. Warum? Zwei Gründe. Das erste ist, weil es das Modell viel sauberer macht, wenn man FKs überall migriert. Die zweite und wichtigste dieser Frage ist, dass das Abrufen von Daten über Joins bei einer einzelnen Ganzzahl schneller und effizienter ist als bei 4 Varchar-Spalten (wie bereits von einigen Leuten erwähnt).

Lassen Sie uns nun ein wenig tiefer in zwei spezifische Subtypen von realen Datenbanken einsteigen. Der erste Typ ist eine Transaktionsdatenbank. Dies ist die Grundlage für viele E-Commerce- oder Content-Management-Anwendungen, die moderne Websites antreiben. Mit einer Transaktions-DB optimieren Sie stark den "Transaktionsdurchsatz". Die meisten Commerce- oder Content-Apps müssen die Abfrageleistung (aus bestimmten Tabellen) mit der Insert-Leistung (in anderen Tabellen) in Einklang bringen, obwohl jede App eigene geschäftsspezifische Probleme zu lösen hat.

Die zweite Art von Real-World-Datenbank ist eine Berichtsdatenbank. Diese werden fast ausschließlich dazu genutzt, Geschäftsdaten zu aggregieren und aussagekräftige Geschäftsberichte zu generieren. Sie sind typischerweise anders geformt als die Transaktionsdatenbanken, in denen die Daten generiert werden, und sie sind für die Geschwindigkeit des Ladens von Massendaten (ETLs) und die Abfrageleistung bei großen oder komplexen Datensätzen optimiert.

In jedem Fall muss der Entwickler oder DBA sowohl die Funktionalität als auch die Leistungskurven sorgfältig ausbalancieren, und es gibt viele leistungssteigernde Tricks auf beiden Seiten der Gleichung. In Oracle können Sie einen so genannten "Explain Plan" ausführen, damit Sie genau sehen können, wie eine Abfrage analysiert und ausgeführt wird. Sie versuchen, die ordnungsgemäße Verwendung von Indizes durch die Datenbank zu maximieren. Ein wirklich scheußliches no-no ist es, eine Funktion in die where-Klausel einer Abfrage einzufügen. Wenn Sie dies tun, garantieren Sie, dass Oracle keine Indizes für diese bestimmte Spalte verwendet und Sie werden wahrscheinlich einen vollständigen oder teilweisen Tabellenscan im Explain-Plan sehen. Das ist nur ein spezifisches Beispiel dafür, wie eine Abfrage geschrieben werden kann, die langsam wird und nichts mit Joins zu tun hat.

Und während wir über Tabellen-Scans sprechen, beeinflussen sie natürlich die Abfragegeschwindigkeit proportional zur Größe der Tabelle. Ein vollständiger Tabellendurchlauf von 100 Zeilen ist nicht einmal bemerkbar. Führen Sie dieselbe Abfrage für eine Tabelle mit 100 Millionen Zeilen aus, und Sie müssen nächste Woche für die Rückgabe zurückkehren.

Lassen Sie uns für eine Minute über Normalisierung sprechen. Dies ist ein weiteres weitgehend positives akademisches Thema, das überstrapaziert werden kann. Die meiste Zeit, wenn wir über Normalisierung sprechen, meinen wir die Beseitigung von doppelten Daten, indem wir sie in eine eigene Tabelle setzen und einen FK migrieren. Leute überspringen normalerweise die ganze Abhängigkeits-Sache, die von 2NF und 3NF beschrieben wird. Und im Extremfall ist es sicherlich möglich, eine perfekte BCNF-Datenbank zu haben, die riesig ist und ein totales Biest, gegen das Code geschrieben werden kann, weil es so normalisiert ist.

Wo balancieren wir? Es gibt keine einzige beste Antwort. Alle der besseren Antworten neigen dazu, einen Kompromiss zwischen einfacher Strukturpflege, einfacher Datenpflege und einfacher Codeerstellung / Wartung zu bilden. Je weniger Daten dupliziert werden, desto besser.

Warum sind Joins manchmal langsam? Manchmal ist es ein schlechtes relationales Design. Manchmal ist es ineffektive Indizierung. Manchmal ist es ein Datenvolumenproblem. Manchmal ist es eine schrecklich geschriebene Frage.

Sorry für solch eine langatmige Antwort, aber ich fühlte mich gezwungen, einen fleischigeren Kontext rund um meine Kommentare zu bieten, anstatt nur eine 4-Kugel-Reaktion herunter zu rattern.


10
2018-04-13 01:00



Menschen mit Datenbanken im Terrabyte-Format nutzen immer noch Joins, wenn sie sie leistungsfähig machen können.

Es gibt viele Gründe, nicht zu denominalisieren. Erstens ist die Geschwindigkeit ausgewählter Abfragen nicht das einzige oder sogar Hauptproblem bei Datenbanken. Die Integrität der Daten ist die erste Sorge. Wenn Sie denormalisieren, müssen Sie Techniken einsetzen, um die Daten zu demormalisieren, wenn sich die übergeordneten Daten ändern. Angenommen, Sie verwenden den Namen des Clients in allen Tabellen, anstatt ihn mit der Client-Tabelle in der client_Id zu verknüpfen. Wenn sich nun der Name des Clients ändert (100% ige Chance, dass sich einige der Namen von Clients im Laufe der Zeit ändern), müssen Sie nun alle untergeordneten Datensätze aktualisieren, um diese Änderung widerzuspiegeln. Wenn Sie dies tun, wird ein Kaskaden-Update und Sie haben eine Million Kind-Datensätze, wie schnell glauben Sie, dass das sein wird und wie viele Benutzer Blockierungsprobleme und Verzögerungen in ihrer Arbeit leiden werden, während es passiert? Die meisten Leute, die denormalisieren, weil "Joins langsam sind", wissen nicht genug über Datenbanken, um sicherzustellen, dass ihre Datenintegrität geschützt ist, und enden oft mit Datenbanken, die nicht brauchbare Daten haben, da die Integrität so schlecht ist.

Die Denormalisierung ist ein komplexer Prozess, der ein gründliches Verständnis der Datenbankleistung und -integrität erfordert, wenn sie korrekt durchgeführt werden soll. Versuchen Sie nicht zu denormalisieren, es sei denn, Sie verfügen über solche Fachkenntnisse.

Joins sind ziemlich schnell genug, wenn Sie mehrere Dinge tun. Verwenden Sie zuerst einen Suggorgate-Schlüssel, ein int-Join ist fast der schnellste Join. Zweitens indizieren Sie immer den Fremdschlüssel. Verwenden Sie abgeleitete Tabellen oder Join-Bedingungen, um einen kleineren zu filternden Datensatz zu erstellen. Wenn Sie eine große, sehr komplexe Datenbank haben, stellen Sie eine professionelle Datenbankperson mit Erfahrung in der Aufteilung und Verwaltung großer Datenbanken ein. Es gibt viele Techniken, um die Leistung zu verbessern, ohne Joins loszuwerden.

Wenn Sie nur Abfragefunktionen benötigen, dann können Sie ja ein Datawarehouse entwerfen, das denormalisiert werden kann und über ein ETL-Tool (optimiert für die Geschwindigkeit) nicht mit Benutzerdaten gefüllt wird.


9
2018-04-12 17:44



Joins sind langsam, wenn

  • Die Daten sind falsch indiziert
  • Ergebnisse werden schlecht gefiltert
  • Verbindungsanfrage schlecht geschrieben
  • Datensätze sehr groß und komplex

Je größer also Ihre Daten sind, desto mehr Verarbeitung benötigen Sie für eine Abfrage, aber das Überprüfen und Bearbeiten der ersten drei Optionen führt oft zu großartigen Ergebnissen.

Ihre Quelle gibt Denormalisierung als eine Option an. Dies ist nur in Ordnung, solange Sie bessere Alternativen ausgeschöpft haben.


8
2018-04-12 17:13



Die Verknüpfungen können langsam sein, wenn große Teile der Datensätze von jeder Seite gescannt werden müssen.

So was:

SELECT  SUM(transaction)
FROM    customers
JOIN    accounts
ON      account_customer = customer_id

Auch wenn ein Index definiert ist account_customer, alle Datensätze von letzterem müssen noch gescannt werden.

Für die Abfrageliste werden die anständigen Optimierer wahrscheinlich nicht einmal den Indexzugriffspfad berücksichtigen, a HASH JOIN oder ein MERGE JOIN stattdessen.

Beachten Sie, dass für eine Abfrage wie folgt:

SELECT  SUM(transaction)
FROM    customers
JOIN    accounts
ON      account_customer = customer_id
WHERE   customer_last_name = 'Stellphlug'

der Beitritt wird höchstwahrscheinlich schnell sein: zuerst ein Index auf customer_last_name Wird benutzt, um alle Stellphlugs (die natürlich nicht sehr zahlreich sind) zu filtern, dann einen Index-Scan an account_customer Für jeden Stellphlug wird ausgestellt, um seine Transaktionen zu finden.

Trotz der Tatsache, dass dies Milliarden von Datensätzen sein können accounts und customers, nur wenige müssen tatsächlich gescannt werden.


7
2018-04-12 17:07



Joins erfordern zusätzliche Verarbeitung, da sie mehr Dateien und mehr Indizes suchen müssen, um die Daten zusammenzufügen. "Sehr große Datensätze" sind jedoch alle relativ. Was ist die Definition von groß? Ich bin der Fall von JOINs, ich denke, es ist ein Verweis auf eine große Ergebnismenge, nicht diese Gesamtdatenmenge.

Die meisten Datenbanken können sehr schnell eine Abfrage verarbeiten, die 5 Datensätze aus einer primären Tabelle auswählt und 5 Datensätze aus einer zugehörigen Tabelle für jeden Datensatz verknüpft (vorausgesetzt, die richtigen Indizes sind vorhanden). Diese Tabellen können Hunderte oder gar Milliarden von Datensätzen enthalten.

Sobald Ihr Ergebnissatz wächst, werden sich die Dinge verlangsamen. Wenn das gleiche Beispiel dazu führt, dass die primäre Tabelle zu 100K-Datensätzen führt, dann werden 500K "verbundene" Datensätze vorhanden sein, die gefunden werden müssen. Ziehen Sie einfach so viele Daten mit zusätzlichen Verzögerungen aus der Datenbank.

Vermeiden Sie JOINs nicht, Sie müssen nur wissen, ob Sie die Daten optimieren / denormalisieren müssen, wenn Datensätze "sehr groß" werden.


3
2018-04-12 17:45



Joins gelten als Gegengewicht zur Skalierbarkeit, da sie typischerweise den Engpass darstellen und nicht einfach verteilt oder parallel geschaltet werden können.


2
2018-04-12 17:09



Richtig gestaltete Tabellen, die mit den richtigen Indices und richtig geschriebenen Abfragen versehen sind, sind nicht immer langsam. Wo auch immer du das gehört hast:

Warum sind Joins schlecht oder "langsam"

hat keine Ahnung worüber sie reden !!! Die meisten Joins werden sehr schnell sein. Wenn Sie viele viele Zeilen auf einmal verbinden müssen, können Sie einen Treffer im Vergleich zu einer denormalisierten Tabelle machen, aber das geht zurück auf Richtig entworfene Tabellen, wissen wann und wann nicht zu denormalisieren. In einem umfangreichen Berichtssystem können Sie die Daten in denormalisierten Tabellen für Berichte ausbrechen oder sogar ein Data Warehouse erstellen. In einem schweren Transaktionssystem normalisieren Sie die Tabellen.


2
2018-04-12 17:09



Joins are fast. Joins sollten als Standardpraxis mit einem ordnungsgemäß normalisierten Datenbankschema betrachtet werden. Joins ermöglichen es Ihnen, unterschiedliche Datengruppen sinnvoll zu verknüpfen. Keine Angst vor dem Beitritt.

Der Vorbehalt besteht darin, dass Sie die Normalisierung, den Beitritt und die ordnungsgemäße Verwendung von Indizes verstehen müssen.

Achten Sie auf vorzeitige Optimierung, da die größte Fehlerquote bei allen Entwicklungsprojekten die Deadline erreicht. Sobald Sie das Projekt abgeschlossen haben und Sie die Kompromisse verstehen, können Sie die Regeln brechen, wenn Sie es rechtfertigen können.

Es stimmt, dass die Join-Leistung nichtlinear abnimmt, wenn die Größe des Datensatzes zunimmt. Daher skaliert es nicht so gut wie Abfragen mit einer einzigen Tabelle, skaliert aber dennoch.

Es ist auch wahr, dass ein Vogel schneller fliegt ohne Flügel, sondern nur geradeaus.


2
2018-04-12 18:02