2010-03-16 2 views
6

Jedes Mal, wenn ein Datenbankdiagramm ausgesehen wird, sind ein Bereich Menschen kritisch für innere Joins. Sie sehen sie hart an und haben Fragen, ob ein innerer Join wirklich da sein muss.Was ist so schlecht an der Verwendung von SQL INNER JOIN

Einfache Bibliothek Beispiel:

Eine Viele-zu-viele-Beziehung normalerweise in SQL mit drei Tabellen definiert: Buch, Kategorie, BookCategory.

In dieser Situation Kategorie ist eine Tabelle, die zwei Spalten enthält: ID, Kategorie.

In dieser Situation habe ich Fragen über die Kategorie Tabelle bekommen, ist es notwendig? Kann es als Nachschlagetabelle verwendet werden, und in der BookCategory Tischspeicher die CategoryName anstelle der CategoryID aufhören, einen zusätzlichen INNER JOIN zu tun. (Für diese Frage werden wir das Ändern und Löschen von CategoryNames ignorieren.)

Die Frage ist, was ist so schlimm an inneren Joins? An welchem ​​Punkt tun sie eine negative Sache (allgemeine Richtlinien wie Anzahl der Transaktionen, Anzahl der Datensätze, Anzahl der Verknüpfungen in einer Aussage, etc.)?

+1

nichts über negative sie, wenn Sie sie dort verwenden, wo sie gebraucht werden .. eigentlich ist es eine sehr positive Sache :) –

+5

Ich habe nie eine breite negative Aussage über INNER JOIN gehört. Kannst du einen Link auf einen Link setzen? –

+1

Ich für einen hätte einen wirklich harten Blick auf ** Outer Join ** Aussage! Das sind potentiell Performance-Killer - schon gar nicht innere Joins ... –

Antwort

5

Ihr Beispiel ist ein gutes Gegenbeispiel. Wie benennt man Kategorien um, wenn sie in den verschiedenen Zeilen der Tabelle BookCategory verteilt sind? Ihre UPDATE Um die Umbenennung zu tun würde alle Zeilen in der gleichen Kategorie berühren.

Mit der separaten Tabelle müssen Sie nur eine Zeile aktualisieren. Es gibt keine doppelten Informationen.

+0

+1 absolut - fassen Sie es gut zusammen. –

+0

Richtig, ich verstehe, dass die Aktualisierung einer Zeile vs viele in einer Tabelle trivial wäre, ich wollte diese Art von Diskussion hieraus behalten, wollte den INNEREN JOIN fokussieren. – SBurris

0

Ich bin mir nicht sicher, es ist etwas falsch in inneren Join per se, es ist wie jedes IF, wenn Sie zu Ihrem Code Auswirkungen Leistung hinzufügen (oder sollte ich jede Zeile sagen ...), aber immer noch, Sie brauchen ein Minimum Anzahl derer, die dein System funktionieren lassen (ja ja, ich kenne Turing-Maschinen). Also, wenn Sie etwas haben, das nicht benötigt wird, wird es verpönt sein.

+0

Joins tatsächlich verbessern Leistung (die meisten Male) ... werfen Sie einen Blick auf http://www.sql-server-performance.com/tips/tuning_joins_p1.aspx –

+0

@Gaby Aufteilen einer Beziehung in zwei und verbinden sie wieder zusammen Wenn Daten abgerufen werden, wird die Abfrage (fast) sicher langsamer. Obwohl es einige Updates schneller machen wird. Ihre verknüpften Seiten geben Hinweise, wie die Leistung eines Joins verbessert werden kann, vergleicht jedoch Modelle mit und ohne Joins überhaupt nicht. –

+0

@Daniel, wenn du alles auswählst, stimme ich zu, dass eine einzige Tabelle die schnellste wäre, aber wenn du anfängst, Filter einzuführen, glaube ich, dass verbundene Tabellen schneller funktionieren, da sie filtern, indem sie Zahlen vergleichen. und ich bin kein Experte in diesem .. –

3

Ich wäre mehr besorgt über OUTER Joins, und das Potenzial, Informationen abzurufen, die nicht beabsichtigt waren.

In Ihrem Beispiel das bedeutet Category Tabelle mit, dass ein Buch zu werden abgelegt unter einem voreingestellten Category begrenzt ist (über eine foriegn Schlüsselbeziehung), wenn Sie nur mehrere Einträge in die BookCategory Tabelle dann wäre es härter geschoben zu Begrenzen Sie, was für die Category ausgewählt ist.

Ein INNER Join ist nicht so schlimm, es ist, wofür Datenbanken gemacht werden. Das einzige Mal, wenn es schlecht ist, ist es, wenn Sie es auf einer Tabelle oder Spalte tun, die nicht ausreichend indiziert ist.

0

Wenn Sie Ihr Domänenmodell auf das relationale Modell abbilden, müssen Sie die Informationen auf mehrere Relationen aufteilen, um ein normalisiertes Modell zu erhalten - dazu gibt es keinen Weg. Und dann müssen Sie Joins verwenden, um die Beziehungen erneut zu kombinieren und Ihre Informationen zurück zu bekommen. Das einzig schlechte daran ist, dass Joins relativ teuer sind.

Die andere Option wäre nicht, Ihr relationales Modell zu normalisieren.Dies wird Ihre Datenbank mit vielen redundanten Daten füllen, Ihnen viele Möglichkeiten geben, Ihre Daten inkonsistent zu machen und Aktualisierungen zu einem Albtraum zu machen.

Der einzige Grund, ein relationales Modell (ich kann im Moment daran denken) nicht zu normalisieren ist, dass die Leseleistung extrem - und ich meine extrem - kritisch ist.

Übrigens, warum erwähnen sie nur innere Verbindungen? Wie unterscheiden sich Links, Rechts und Full Outer Joins signifikant von Inner Joins?

0

Niemand kann viel über allgemeine Richtlinien anbieten - sie wären spezifisch für Server, Hardware, Datenbankdesign und Erwartungen ... viel zu viele Variablen.

Speziell über INNER JOINs ineffizient oder schlecht ... JOINs sind das Zentrum der relationalen DBs, und sie sind schon seit Jahrzehnten. Es ist nur falsch, wenn man es falsch benutzt, weil offensichtlich jemand es richtig macht, da es noch nicht ausgestorben ist. Persönlich würde ich annehmen, dass jeder, der so aussagekräftige Aussagen auswirft, entweder SQL nicht kennt oder gerade genug weiß, um in Schwierigkeiten zu geraten. Wenn sie das nächste Mal auftauchen, sollten Sie ihnen beibringen, wie der Abfrage-Cache verwendet wird.

(nicht zu erwähnen Update/löschen, aber Sie habe nicht gesagt, fügt die erhöhte Wartbarkeit durch Vermeidung von Menschen und ihre Fehler mindestens 10x die Zeit wert sein, eine leicht kann dauern. !: beitreten)