2017-02-28 3 views
-3

ich diese Abfrage in SQL haben, und ich möchte wissen, was ein (LEFT JOIN/INNER JOIN) muss ich, um zu verwenden, die Geschwindigkeit und die Verbesserung der Kenntnisse zu erhöhenINNER vs LEFT JOIN JOIN Performance in SQL

UPDATE poker_hands f 
INNER JOIN (poker_cards a, poker_cards b, 
poker_cards c, poker_cards d, poker_cards e) 
ON f.r1 = a.card_name 
AND f.r2 = b.card_name 
AND f.r3 = c.card_name 
AND f.r4 = d.card_name 
AND f.r5 = e.card_name 
SET f.hand_type = 'Royal flush' 
WHERE ((a.suit = b.suit AND b.suit = c.suit 
AND c.suit = d.suit AND d.suit = e.suit) 
AND (a.game_value = 14 AND b.game_value = 13 
AND c.game_value = 12 AND d.game_value = 11 AND e.game_value = 10)); 
+1

Welcher Server? [mysql] oder [sql-server]? –

+2

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

Antwort

0

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' 
1

Leistung ist nicht die Frage-- INNER JOIN und LEFT JOIN verschiedene Dinge tun. Verwenden Sie dasjenige, das Ihrem Bedarf entspricht