2017-02-28 103 views
-3

我在SQL此查詢,我想知道哪一個 (LEFT JOIN/INNER JOIN),我必須爲了提高速度,提高熟練程度使用INNER JOIN VS LEFT JOIN性能在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

哪個服務器? [mysql]或[sql-server]? –

+2

試一下,看看哪個跑得快。如果你無法區分差異,那麼你正在浪費你的時間來嘗試優化某些你甚至不確定需要優化的東西。而且,這兩件事並不相同,所以這個問題很奇怪。 – csmckelvey

回答

0

通過此聲明,WHERE子句中的謂詞將否定LEFT JOIN的「外部性」,使其等效於INNER JOIN。

我期望優化器能夠識別出這種情況,並選擇最具成本效益的方案。我期望等效的執行計劃,並且當INNER關鍵字替換爲LEFT時,我不希望在此查詢中觀察到性能差異。

但是不看實際的執行計劃,這只是猜測。要查看執行計劃,我們可以使用EXPLAIN(MySQL的)或SET SHOWPLAN_ALL ON(用於SQL Server,或STATISTICS PROFILE ON,等。)

不同報表的實際表現可以觀察和測量。


我不明白你爲什麼要使用LEFT JOIN。

(和老派的逗號語法的加入操作與新JOIN關鍵字混合...什麼與怎麼了?)


至於提高性能,我們會很需要確保合適的索引可用,並正在使用。我們需要看執行計劃。我們可能需要確保收集的統計數據是最新的,我們可能需要對SQL進行一些調整以獲得更有效的計劃。

LEFT代替INNER可能會影響現有查詢的性能,但它不可能解決性能問題。

就個人而言,我更願意探討等效查詢的執行,以此爲出發點:

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

表現不是問題 - INNER JOINLEFT JOIN做不同的事情。使用哪一個適合您的需要