Was sind die Vorteile des expliziten Join-Transitive-Closure in SQL?

StackOverflow https://stackoverflow.com/questions/11028

  •  08-06-2019
  •  | 
  •  

Frage

Wenn ich drei oder mehr Tabellen durch eine gemeinsame Spalte verbinde, würde ich meine Abfrage so schreiben:

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id

Ein Kollege hat mich kürzlich gefragt, warum ich das nicht explizit gemacht habe Treten Sie der Transitiven Schließung bei in meinen Abfragen wie dieser:

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id
AND    c.id = a.id

Hat das wirklich Vorteile?Sicherlich kann der Optimierer dies für sich selbst implizieren?

bearbeiten:Ich weiß, dass es eine böse Syntax ist, aber es ist ein schnelles und schmutziges Beispiel für legitimen Legacy-Code +1 @Stu zum Aufräumen

War es hilfreich?

Lösung

In heutigen Datenbank-Engines ist dies nicht erforderlich, aber es gab eine Zeit, in der solche Dinge dem Abfrageoptimierer mehr Hinweise auf mögliche Indexpfade und damit schnellere Ergebnisse lieferten.

Heutzutage geht ohnehin die gesamte Syntax verloren.

Andere Tipps

Das ist eine schmutzige, böse Legacy-Syntax.Sie schreiben dies als

Select
  *  -- Oh, and don't ever use *, either
From
  A 
  Inner Join B On A.ID = B.ID
  Inner Join C On B.ID = C.ID

Nein, diese Syntax stammt aus der Zeit, bevor es Joins in der Sprache gab.Ich bin mir nicht sicher, welche Probleme damit verbunden sind, aber es gibt definitiv Sprachkonstrukte, die für die Verknüpfung von Tabellen besser unterstützt werden.

Ich möchte nur sagen, dass diese Art des Beitritts Teufelswerk ist.
Denken Sie einfach darüber nach;Die Bedingungen für das Verbinden und Filtern werden in der Where-Anweisung gemischt.
Was passiert, wenn Sie 20 Tabellen verknüpfen und nach 15 Werten filtern müssen?

Wieder nur meine 0,02 $

In Microsoft SQL sind die Abfragepläne für diese beiden Abfragen identisch – sie werden auf die gleiche Weise ausgeführt.

Wenn Sie es mathematisch betrachten, sollten Ihre Beispiele zu den gleichen Ergebnissen führen.

a = b = c

Ihr erstes Beispiel würde also die gleichen Ergebnisse liefern wie das zweite, sodass keine zusätzliche Arbeit erforderlich ist.

Diese Frage ähnelt dieser hier mit einer sehr ausführlichen Erklärung:

SQL-Frage aus dem Artikel von Joel Spolsky

Die kurze Antwort lautet: Die explizite Deklaration der transitiven Eigenschaft kann die Abfrage beschleunigen.Dies liegt daran, dass die Abfrageoptimierung keine triviale Aufgabe ist und einige SQL-Server möglicherweise Probleme damit haben.

Diese Syntax hat jedoch ihren Nutzen ...Es gibt Zeiten, in denen Sie feststellen, dass Sie zwei Tabellen in mehr als einem Feld verbinden müssen

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