Lukas.: Welche Query arbeitet schneller?

Moin,

ich habe 2 Queries, die beide funktionieren und dasselbe Ergebnis produzieren. Nun weiß ich nciht recht, welche hiervon schneller arbeitet. Ich tendiere zu Lösung 2, habe aber keine rechte Begründung hierfür.

Kann mir einer anhand der Queries alleine hier überhaupt jemand helfen?

L.

SELECT r.RID
FROM table_r r
JOIN table_rz rz ON r.RID = rz.RID
JOIN table_f f ON rz.MID = f.MID
WHERE r.Druck = 0 AND
f.FRID = 6000


SELECT r.RID
FROM table_r r
JOIN table_rz rz ON r.RID = rz.RID
WHERE
rz.MID IN (SELECT f.MID FROM table_f f WHERE f.FRID = 6000) AND
r.Druck = 0
  1. Hallo Lukas.,

    ich habe 2 Queries, die beide funktionieren und dasselbe Ergebnis produzieren. Nun weiß ich nciht recht, welche hiervon schneller arbeitet. Ich tendiere zu Lösung 2, habe aber keine rechte Begründung hierfür.

    Wahrscheinlich sind die Queries gleich schnell, weil der Optimizer dein Problem erkennt. Aber genaueres kann dir EXPLAIN sagen.

    Lässt man den Optimizer außen vor, hängt es von der Größe der Ergebnismenge ab, welche Query schneller ist: ist die Ergebnismenge der Subquery klein, so wird die Subquery vermutlich schneller sein, weil das Resultset unangetastet bleibt. Ist die Menge groß, wird es die JOIN-Variante sein, weil das Ergebnis der Subquery auf die Platte ausgelagert werden müsste.

    Viel wahrscheinlicher aber ist, dass beide Queries gleich performen.

    Kann mir einer anhand der Queries alleine hier überhaupt jemand helfen?

    Nur sehr grob. Befrage EXPLAIN und SELECT BENCHMARK(), die sind die einzige autoritative Quelle.

    LG,
    CK

    1. Hallo Christian,

      erstmal danke für die schnelle Antwort am frühen Sonntagmorgen.

      Lässt man den Optimizer außen vor, hängt es von der Größe der Ergebnismenge ab, welche Query schneller ist: ist die Ergebnismenge der Subquery klein, so wird die Subquery vermutlich schneller sein, weil das Resultset unangetastet bleibt. Ist die Menge groß, wird es die JOIN-Variante sein, weil das Ergebnis der Subquery auf die Platte ausgelagert werden müsste.

      Wobei dann wieder die Frage ist, was "klein" und "groß" in diesem Zusammenhang ist.

      Viel wahrscheinlicher aber ist, dass beide Queries gleich performen.

      Was mir als Ergebnis schon ausreicht.

      Befrage EXPLAIN und SELECT BENCHMARK(), die sind die einzige autoritative Quelle.

      Mache ich interessehalber. Da diese Query aber in meinem Projekt ausschließlich in einem absoluten Sonderfall eingesetzt werden wird (und somit ggf. 1 x pro Jahr vorkommt), finde ich es schon ausreichend, zu wissen, dass beide in etwa gleich schnell arbeiten werden. Mehrere Tests in phpmyadmin zeigten zudem, dass beide Queries für sich gesehen eh schon sehr schnell sind.

      Danke für die Hilfe, L.

      1. Hallo Lukas.,

        Lässt man den Optimizer außen vor, hängt es von der Größe der Ergebnismenge ab, welche Query schneller ist: ist die Ergebnismenge der Subquery klein, so wird die Subquery vermutlich schneller sein, weil das Resultset unangetastet bleibt. Ist die Menge groß, wird es die JOIN-Variante sein, weil das Ergebnis der Subquery auf die Platte ausgelagert werden müsste.

        Wobei dann wieder die Frage ist, was "klein" und "groß" in diesem Zusammenhang ist.

        Das ist abhängig von der Konfiguration des DBMS 😉 passt die Ergebnismenge in die maximal zulässige Menge Speicher für eine Query ist sie „klein,” sonst „groß” 😂

        LG,
        CK

        1. @@Christian Kruse

          „klein,” sonst „groß” 😂

          Kudos für die öffnenden Anführungszeichen unten.

          Die schließenden wären unweit weg von dir im Niederländischen auch richtig. Unweit von mir im Polnischen auch. Im Deutschen zeigen sie aber andersrum: Doppel-6 “.

          LLAP 🖖

          --
          “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
          1. Hallo Gunnar,

            Im Deutschen zeigen sie aber andersrum: Doppel-6 “.

            Ich weiß. Sind mir aber zu mühsam einzugeben.

            Wobei, ich sehe gerade, macOS hat das deutsche Tastatur-Layout geändert, auf Option-^ liegt jetzt und auf Option-2 liegt jetzt . Cool, Option-Shift-w und Option-Shift-2 gingen mir auch langsam auf den Geist 😂

            LG,
            CK