【问题标题】:Altering Order of tables in JOIN condition在 JOIN 条件下更改表的顺序
【发布时间】:2015-06-06 13:18:18
【问题描述】:

鉴于以下情况:

表 A 有 1000 行,表 B 有 5000 行。

Q1: Select * from Table_A Left Outer Join Table_B 开启条件

Q2:Select * from Table_B Left Outer Join Table_A 开启条件

这有什么不同吗?在这些情况下会有任何性能差异吗?

【问题讨论】:

  • 您使用的是哪个数据库?微软访问?
  • 嗨,约翰,我要求任何数据库。
  • 性能是特定于 DBMS 的,所以我们无法回答这部分问题,除非您告诉我们是哪一个。
  • 感谢约翰的回复..

标签: sql join


【解决方案1】:

是的,它对LEFT JOIN 产生了很大的不同。两条语句不一样,执行路径很可能不一样。

第一个查询保留表 A 中的所有行,以及表 B 中的任何匹配值。所以这个版本至少返回 1000 行。

第二个保留表 B 中的所有行,以及表 A 中的任何匹配值。这不是一回事。此版本至少返回 5000 行。

对于INNER JOIN(或FULL OUTER JOIN),FROM 子句中的表顺序不会影响结果集。但是,取决于优化器,它可能会影响连接的处理方式(我正在考虑优化器采用捷径的长连接链)。

【讨论】:

    【解决方案2】:

    这有什么不同吗?

    是的。 LEFT JOIN 定义:返回左表的所有行+两个表中的匹配行。匹配行意味着两个表的交集。

    所以在你的情况下,返回的行数会有很大的不同。

    Q1: Select * from Table_A Left Outer Join Table_B ON condition
    

    在这种情况下,返回的行数将是 1000(因为您的 tableA 有 1000 行并且在 JOIN 的左侧)加上匹配项(表之间的交叉点)

    Q2: Select * from Table_B Left Outer Join Table_A ON condition
    

    在这种情况下,返回的行数将是 5000(因为您的 tableB 有 5000 行并且在 JOIN 的左侧)加上匹配项(表之间的交叉点)

    查看相同[图片取自This CodeProject Post]的视觉表示:

    【讨论】:

    • 谢谢 :) 但是这里会有任何相当大的性能差异..?左侧行数较少的表获取速度更快??
    【解决方案3】:

    这两个查询会有不同的结果。

    W3 Schools Left Join

    然后转到“亲自尝试”页面。可以为 LEFT OUTER JOIN 编辑 SQL。

    【讨论】:

    • 感谢您的解释。但是这里会有任何相当大的性能差异..?左侧行数较少的表获取速度更快??
    • 请不要引用 W3 学校。他们因信息不准确而臭名昭著。见meta.stackoverflow.com/questions/280478/why-not-w3schools-com
    • 我将他引导至 Try It Yourself 页面,让 OP 亲自尝试并查看差异。这是我的意图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2019-12-09
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多