ist NATURAL JOIN besser als SELECT FROM WHERE in Bezug auf die Leistung? [Duplikat]

8

Heute habe ich mich mit meinem Projektleiter über kartesische Produkte unterhalten. Er sagt, dass ein "natürlicher Join" irgendwie viel besser ist als "select from where", weil die db-Engine intern später ein kartesisches Produkt ausführt, aber erstere verwendet einen anderen Ansatz, der dies verhindert. Soweit ich weiß, ist die natürliche Join-Syntax in nichts anders als "Auswahl von wo" in Bezug auf Leistung oder Bedeutung, ich meine, dass Sie entweder basierend auf Ihrem Geschmack verwenden können.

%Vor%

Bitte erläutern Sie die erste Abfrage, die ein kartesisches Produkt verursacht, aber die zweite ist irgendwie mehr smart

    
ashy_32bit 17.06.2010, 15:28
quelle

5 Antworten

14

Der richtige Weg sollte explizit mit getrennten Filtern und Joins sein

%Vor%

NATÜRLICHE VERBINDUNGEN sind vielleicht einfach und "sauber", aber eher unvorhersehbar ...

Bearbeiten, Mai 2012.

Die angenommene Antwort für das Duplikat beantwortet NATURAL JOIN nicht.
Diese Links diskutieren weiter.

tl; dr

Leistung ist nicht das Problem: aber Ihre Abfragen sollten zuverlässig und vorhersehbar sein, was natürlich nicht ist.

"JOIN in der WHERE" aka implizierte JOIN aka, was Sie "Cartesian" nennen, ist auch bad gemäß diesen Links (das gilt auch für Oracle und SQL Server)

    
gbn 17.06.2010 15:38
quelle
3

Kommt darauf an.

Ein natürlicher Join verknüpft alle Spalten in zwei Tabellen mit demselben Namen. Wenn die beiden identischen Spalten in den Tabellen 1 und 2 identisch sind, sollten die beiden Abfragen vom Optimierer identisch ausgewertet werden. Wenn andererseits in den beiden Tabellen mehr als zwei Spalten mit demselben Namen (oder keiner) vorhanden sind, wird eine vollständig andere Abfrage ausgeführt.

In jedem Fall wird ein kartesisches Produkt fast immer (ich bin versucht, immer zu sagen) schlechter abschneiden als jede andere Art von Join, da es jeden Datensatz einer Tabelle mit jedem Datensatz der anderen Tabelle verbindet.

>

Wie gut ist Ihr Manager darin, seinen großen Gesäßmuskel vom oberen Ende seiner Ulna zu unterscheiden?

    
Mark Bannister 17.06.2010 15:44
quelle
2

Leistungsmäßig gibt es keinen Unterschied. Es wurde immer und immer wieder diskutiert. Googeln nach "Join Syntax Orakel vs wo" ergibt mehrere gute Artikel, einschließlich der auf dieser Website von Alexander verwiesen.

Achten Sie jedoch darauf, einen NATURAL JOIN zu verwenden. Es wird auf allgemeine Spalten wie createate oder createuser zurückgreifen oder auf solche, bei denen es normalerweise nicht so wichtig ist, dass Sie sich daran anschließen und Probleme verursachen können. Ich empfehle sehr gegen NATURAL JOIN in der Produktion ... einfach INNER JOIN verwenden und die Spalten angeben.

Sogar Tom stimmt zu .

    
rfusca 17.06.2010 15:37
quelle
2

Als Erstes müssen Datenbankoptimierer die Syntax auf ihre Art interpretieren. Offensichtlich variiert jedes Produkt, aber ich wäre ehrlich gesagt erstaunt, wenn irgendein DBMS bestraft, was der üblichste Mechanismus für das Verbinden von Tabellen ist.

In Bezug auf die Terminologie ist es eine Kreuzverbindung, die ein kartesisches Produkt erzeugt. Das unterscheidet sich von einem inneren Join und würde eine andere Ergebnismenge erzeugen.

Schließlich sind natürliche Joins schrecklich, buchstäblich Bugs, die darauf warten, dass sie passieren. Sie sollten von allen richtig denkenden Menschen vermieden werden.

    
APC 17.06.2010 15:38
quelle
2

Ich würde keine der beiden Syntax verwenden. Ihre Abfrage zeigt einen inneren Join an, ich würde dafür die explizite Syntax verwenden. Sie sollten keine implizierten Joins verwenden, sie unterliegen einer Fehlinterpretation (war das ein zufälliger Cross-Join oder wollten Sie das?) Und zufälligen Cross-Joins. Würden Sie C # -Code verwenden, der vor 18 Jahren mit einer besseren Syntax ersetzt wurde (naja, tatsächlich existierte C # vor 18 Jahren nicht, aber ich denke, Sie verstehen, was ich sage)? Warum verwenden Sie dann veralteten SQL-Code?

Der implizierte Join ist nicht nur ein Wartungsproblem, sondern kann auch ein großes Problem darstellen, wenn Sie versuchen, die implizierte Joinsyntax für Outer-Joins zu verwenden, da dies in einigen Datenbanken nicht korrekt funktioniert und auch in mindestens einer Datenbank veraltet ist , SQL Server, ich weiß. Und wenn Sie einen Filter für die Tabelle im linken Join benötigen, können Sie das mit der impliziten Syntax überhaupt nicht tun, da es in einen innner Join konvertiert wird.

Ja, Ihr Code funktioniert, aber es ist eine schlechte Technik, und Sie sollten sich daran gewöhnen, den inneren Join explizit zu verwenden, damit Sie Ihre Absicht klar machen, um Maintainers zu unterstützen und so keine versehentlichen Probleme zu erzeugen, während Sie komplexer schreiben Abfragen. Wenn die Verwendung der expliziten Syntax nicht die zweite Natur für Sie ist, werden Sie wirklich Schwierigkeiten haben, wenn Sie etwas komplizierter verwenden müssen.

Ich habe in 30 Jahren Datenbankabfragen nie eine Notwendigkeit gesehen, einen natürlichen Join zu schreiben und musste nachsehen, was man war, also ist das nicht klarer als die implizierte Join.

    
HLGEM 17.06.2010 17:48
quelle

Tags und Links