Mit dieser Aussage würden die Prädikate in der WHERE
-Klausel die "Outerness" eines LINKEN JOIN negieren, was einem INNEREN JOIN entspricht.
Ich würde erwarten, dass der Optimierer das erkennen würde und in jedem Fall den kosteneffizientesten Plan wählen würde. Ich würde äquivalente Ausführungspläne erwarten, und ich würde nicht erwarten, einen Leistungsunterschied in dieser Abfrage zu beobachten, wenn das Schlüsselwort INNER
durch LEFT
ersetzt wird.
Aber ohne die tatsächlichen Ausführungspläne zu betrachten, das ist nur Vermutung. Um den Ausführungsplan zu sehen, können wir EXPLAIN
(für MySQL) oder SET SHOWPLAN_ALL ON
verwenden (für SQL Server oder STATISTICS PROFILE ON
, et al.)
Die tatsächliche Leistung der verschiedenen Aussagen beobachtet und gemessen werden.
Ich verstehe nicht, warum Sie einen LINKEN JOIN überhaupt verwenden möchten.
(Und die Vermischung der alten Schule Komma Syntax für die Join-Operation mit dem Schlüsselwort neueren JOIN ... was damit los ist?)
Soweit die Leistung zu verbessern, würden wir wirklich Sie müssen sicherstellen, dass geeignete Indizes verfügbar sind und verwendet werden. Wir müssen die Ausführungspläne betrachten. Wir müssen möglicherweise sicherstellen, dass Statistiken gesammelt und auf dem neuesten Stand sind, und wir müssen möglicherweise einige Änderungen an der SQL vornehmen, um einen effizienteren Plan zu erhalten.
Es ist möglich, dass das Ersetzen von INNER
durch LEFT
einen Unterschied in der Leistung der vorhandenen Abfrage bewirken kann, aber es ist wahrscheinlich kein Heilmittel für ein Leistungsproblem.
Persönlich würde ich es vorziehen, die Leistung einer äquivalenten Abfrage zu untersuchen, wobei diese als Ausgangspunkt:
UPDATE poker_hands f
JOIN poker_cards a ON a.card_name = f.r1 AND a.game_value = 14
JOIN poker_cards b ON b.card_name = f.r2 AND b.game_value = 13 AND b.suit = a.suit
JOIN poker_cards c ON c.card_name = f.r3 AND c.game_value = 12 AND c.suit = a.suit
JOIN poker_cards d ON d.card_name = f.r4 AND d.game_value = 11 AND d.suit = a.suit
JOIN poker_cards e ON e.card_name = f.r5 AND e.game_value = 10 AND e.suit = a.suit
SET f.hand_type = 'Royal flush'
Welcher Server? [mysql] oder [sql-server]? –
Probieren Sie es mit beiden und sehen Sie, welche schneller läuft. Wenn Sie keinen Unterschied feststellen können, verschwenden Sie Ihre Zeit damit, etwas zu optimieren, von dem Sie nicht einmal sicher sind, dass es optimiert werden muss. Außerdem sind diese zwei Dinge nicht gleichwertig, so dass die Frage von Anfang an seltsam ist. – csmckelvey