【问题标题】:INNER JOIN vs LEFT JOIN performance in SQLSQL 中的 INNER JOIN 与 LEFT JOIN 性能
【发布时间】:2023-03-17 23:49:01
【问题描述】:

我在 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));

【问题讨论】:

  • 哪个服务器? [mysql] 还是 [sql-server]?
  • 两者都试一下,看看哪个跑得更快。如果您无法区分,那么您就是在浪费时间尝试优化您甚至不确定是否需要优化的东西。此外,这两件事并不等同,所以这个问题一开始就很奇怪。

标签: mysql sql-server


【解决方案1】:

性能不是问题——INNER JOINLEFT JOIN 做不同的事情。使用适合您需要的任何一个

【讨论】:

    【解决方案2】:

    使用此语句,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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2015-07-18
      • 2013-07-19
      相关资源
      最近更新 更多