Problem mit JOINs

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit JOINs

    Hallo!

    Ich habe folgende Abfrage:

    Quellcode

    1. SELECT comments.*, user.name, ratings.rating
    2. FROM comments
    3. JOIN user ON user.id = comments.user
    4. JOIN ratings ON comments.user = ratings.user AND comments.movie = ratings.movie
    5. WHERE comments.movie = "4" AND [...];

    Nun ist allerdings in der Tabelle "ratings" nicht immer ein Datensatz vom Benutzer verfügbar.
    Dann erhalte ich gar kein Ergebnis. Alle anderen Datensätze sind garantiert verfügbar

    Ich möchte aber in jedem Fall ein Ergebnis haben, also einfach bei ratings.rating ein Ergebnis alá NULL, hauptsache, ich erhalte den Datensatz, Rating hin oder her.
    Ob ein Rating verfübar ist bzw. ein vernünftiger Wert zurück kam, überprüfe ich vor der Ausgabe.

    *edit*: Bin ein JOIN Neuling! ;)
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • ....aber mit einer ganz unterschiedlichen Performance.

    Wenn du hier stattdessen einen CROSS JOIN gemacht hättest (entspricht der Schreibe ...FROM tableA, tableB WHERE....) dann würden erst alle Datensätze kombiniert werden. Also O(n²)! Auf die zusammengesetzte Masse würde die Einschränkung mit WHERE gemacht werden. Beim JOIN wird nur kombiniert was mit der JOIN Bedingung matcht.

    Du kannst ja mal eine Tabelle mit 100.000 Datensätzen anlegen und folgende Ergebnisse vergleichen

    Quellcode

    1. EXPLAIN ANALYZE SELECT A.spalte, B.spalte FROM tabelle A, tabelle B WHERE A.spalte2 = B.spalte2;
    2. EXPLAIN ANALYZE SELECT A.spalte, B.spalte FROM tabelle A JOIN tabelle B ON (A.spalte2 = B.spalte2);


    In der Vorlesung wurde das mit einer Studentendatenbank gemacht (Die Anzahl der Datensätze weiß ich leider nicht mehr). Aber die Ausführungszeit hat sich tatsächlich etwa um den Faktor 1.000 unterschieden.

    Bei DBMS Systemen wie denen von Oracle laufen die SELECTs erst durch einen QueryOptimizer. Da passiert das nicht. Ich könnte mir auch vorstellen, dass MySQL soetwas ähnliches besitzt, aber man sollte es besser gleich "richtig" machen.