Rafael: JOIN und WHERE-Frage

Hallo Forum,
gibt es irgendeinen Performancebedingten Grund, Tabellen mit einem JOIN zu verbinden statt dies in der WHERE-Klausel zu umschreiben?

Als Beispiel:

SELECT tabelle1.foo, tabelle2.bar
FROM tabelle1,tabelle2
WHERE tabelle2.key = tabelle1.key AND tabelle1.foo = 'test'

ergbit doch das Gleiche wie:

SELECT tabelle1.foo, tabelle2.bar
FROM tabelle1
INNER JOIN tabelle2
ON tabelle2.key = tabelle1.key
WHERE tabelle1.foo = 'test'

Mein "Problem" ist das folgende: Ich möchte mittels einer Funktion aus einer Angabe a la:

my_list('tabelle1.foo,tabelle2.bar','tabelle1.foo=test,tabelle1.key=tabelle2.key');

automatisch eine HTML-Listenansicht generieren. Wenn ich hier eine bestimmte Tabelle auswählen muss, die sich dann in der WHERE-Stelle findet, dann ist das irgendwie sehr zufällig, finde ich. Ich hätte daher gerne alle Tabellen unter der FROM-Klausel, um die JOIN-Bedingung dann unter WHERE zu definieren. Macht das irgendeinen technischen oder performancebedingten Unterschied?

Danke für jeden Tipp.
Liebe Grüße.

  1. Hello,

    Macht das irgendeinen technischen oder performancebedingten Unterschied?

    das dürfte stark vom Optimizer des DBMS abhängen. Wenn er erkennt, dass die Bedingungen einen INNER JOIN ergeben, dann wird er das Statement für dich im Hintergrund umschreiben. Wenn er es nicht erkennt, dann heißt das leider, dass du zunächst ein Kreuzprodukt bildest, also aus
    1     1
    2     2
    3     3
    nicht 3 Datensätze sondern 9 Datensätze machst, bevor du die überwiegende Mehrheit in die ewigen RAM-Gründe schickst - Einen Hinweis darauf, wie dein DBMS das abarbeitet, dürfte ein EXPLAIN SELECT ... liefern.

    MfG
    Rouven

    --
    -------------------
    "I wish it need not have happened in my time" - "So do I, and so do all who live to see such times. But that is not for them to decide. All we have to decide is what to do with the time that is given us."  --  J.R.R. Tolkien: "The Lord Of The Rings: The Fellowship Of The Ring"
    1. Danke. Ich wollte die Join-Bedingung ohnehin auslagern, so dass man gleichheit von Foreign- und Primary-Key nur einmal festlegen muss. Ich denke mir einfach einen Mechanismus aus, der dann überprüft, ob eine solche Bedingung vorliegt und dann einen Join erzeugt oder einen einfachen Select.

      Danke jedenfalls für deine Ausführung! Auch an den/die zweite Helfenden.

  2. yo,

    gibt es irgendeinen Performancebedingten Grund, Tabellen mit einem JOIN zu verbinden statt dies in der WHERE-Klausel zu umschreiben?

    jein, grundsätzlich macht es keinen unterschied, da das dbms alle join-bedingungen intern sowieso in die WHERE klausel mit aufnimmt. allerdings kannes eine sehr große rolle spielen, in welcher reihenfolge die joins gebildet werden.

    anzuraten ist wegen der lesbarkeit aber die explizite Join Syntax.

    Ilja