我在SQL中有这个查询,我想知道哪一个 (LEFT JOIN / INNER JOIN)我必须使用以提高速度和提高熟练程度
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));
答案 0 :(得分:1)
效果不是问题 - INNER JOIN
和LEFT JOIN
做不同的事情。使用符合您需求的任何一种
答案 1 :(得分:0)
使用此语句,WHERE
子句中的谓词将否定LEFT JOIN的“外部性”,相当于INNER JOIN。
我希望优化器会认识到这一点,并在任何一种情况下选择最具成本效益的计划。我期望等效的执行计划,当INNER
关键字替换为LEFT
时,我不希望在此查询中发现性能差异。
但是没有看实际的执行计划,那只是猜想。要查看执行计划,我们可以使用EXPLAIN
(对于MySQL)或SET SHOWPLAN_ALL ON
(对于SQL Server或STATISTICS PROFILE ON
等)。
可以观察和衡量不同陈述的实际表现。
我不明白你为什么要使用LEFT JOIN。
(并且将连接操作的旧式逗号语法与较新的JOIN关键字混合......具体是什么?)
就提高性能而言,我们确实需要确保合适的索引可用且正在使用。我们需要查看执行计划。我们可能需要确保收集和更新统计信息,我们可能需要对SQL进行一些调整以获得更有效的计划。
将INNER
替换为LEFT
可能会对现有查询的性能产生影响,但它不太可能解决性能问题。
就个人而言,我更倾向于调查等效查询的性能,以此为出发点:
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'