SQL IN und =

Da erschafft man einen völlig neuen Wettkampf, der von 31 Teams weltweit wahrgenommen wird. Hunderte von Menschen diskutieren in zig Foren in deutsch, englisch, französisch, russisch, chinesisch, spanisch, japanisch, tschechisch etc. über die beste Taktik, um diese Challenge zu gewinnen. Und man selber ist heilfroh, dass alles funktioniert: die Statistiken werden korrekt erstellt, die Daten werden richtig importiert, man hat sogar die Muße den Importvorgang in der laufenden Challenge noch ein wenig zu optimieren – Operation am offenen Herzen quasi…

Selbst der alte Server (im nächsten Monat gibt’s einen neuen) funktioniert trotz fast doppelt so hohen Besucherzahlen. Und man denkt: Mensch, wat biste fürn dufter Typ?! Klappt ja alles 1A!

Und dann kommt die Hiobsbotschaft der Serverload ist manchmal 10.00. Irgendetwas stimmt nicht. Irgendeine Anfrage dauert zu lange. Man überprüft die Seiten und stellt fest, dass eine Abfrage dabei ist, die anfangs nur wenige Millisekunden gebraucht hat, jetzt aber 70 Sekunden braucht.. Eine typische Anfrage:
[code lang=’sql‘]SELECT
[…]
output_24h
FROM
pentathlon_score
INNER JOIN
pentathlon_team
ON pentathlon_score.teamid = pentathlon_team.teamid
WHERE
zeitpunkt IN (SELECT max(zeitpunkt) FROM pentathlon_score WHERE disziplinid= 1) AND
disziplinid = 1 AND
Rank > 0
ORDER BY Rank ASC[/code]
Und schließlich stellt man fest, dass wenn man das IN durch ein = ersetzt, die Anfrage plötzlich nur noch 0,05 Sekunden dauert.
[code lang=’sql‘]SELECT
[…]
output_24h
FROM
pentathlon_score
INNER JOIN
pentathlon_team
ON pentathlon_score.teamid = pentathlon_team.teamid
WHERE
zeitpunkt = (SELECT max(zeitpunkt) FROM pentathlon_score WHERE disziplinid= 1) AND
disziplinid = 1 AND
Rank > 0
ORDER BY Rank ASC[/code]
und das, obwohl die Unterabfrage SELECT max(zeitpunkt) […] nur einen Wert zurück gibt..!?!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.