sql - JOIN 的 ON 子句中引用的表的顺序是否重要?

标签 sql mysql sql-server oracle

我在 ON 子句中为 JOIN 排序条件的方式是否重要?

select a.Name, b.Status from a
inner join b
on a.StatusID = b.ID

select a.Name, b.Status from a
inner join b
on b.ID = a.StatusID

对性能有影响吗?如果我有多个条件怎么办?

一个订单比另一个更易于维护吗?

最佳答案

JOIN 可以通过在 FROM 子句中以正确的顺序放置表来强制执行顺序:

  1. MySQL 有一个名为 STRAIGHT_JOIN 的特殊子句,它使顺序很重要。

    这将使用 b.id 上的索引:

    SELECT  a.Name, b.Status
    FROM    a
    STRAIGHT_JOIN
            b
    ON      b.ID = a.StatusID
    

    这将使用 a.StatusID 上的索引:

    SELECT  a.Name, b.Status
    FROM    b
    STRAIGHT_JOIN
            a
    ON      b.ID = a.StatusID
    
  2. Oracle 有一个特殊提示 ORDERED 来强制执行 JOIN 顺序:

    这将使用 b.id 上的索引或在 b 上构建哈希表:

    SELECT  /*+ ORDERED */
            *
    FROM    a
    JOIN    b
    ON      b.ID = a.StatusID
    

    这将使用 a.StatusID 上的索引或在 a 上构建哈希表:

    SELECT  /*+ ORDERED */
            *
    FROM    b
    JOIN    a
    ON      b.ID = a.StatusID
    
  3. SQL Server 有一个名为 FORCE ORDER 的提示来执行相同的操作:

    这将使用 b.id 上的索引或在 b 上构建哈希表:

    SELECT  *
    FROM    a
    JOIN    b
    ON      b.ID = a.StatusID
    OPTION (FORCE ORDER)
    

    这将使用 a.StatusID 上的索引或在 a 上构建哈希表:

    SELECT  *
    FROM    b
    JOIN    a
    ON      b.ID = a.StatusID
    OPTION (FORCE ORDER)
    
  4. PostgreSQL 伙计们,对不起。您的 TODO list说:

    Optimizer hints (not wanted)

    Optimizer hints are used to work around problems in the optimizer. We would rather have the problems reported and fixed.

至于比较中的顺序,在任何RDBMS,AFAIK中都无所谓。

虽然我个人总是尝试估计将搜索哪一列并将该列放在左侧(因为它看起来像一个 lvalue)。

this answer了解更多详情。

关于sql - JOIN 的 ON 子句中引用的表的顺序是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/785583/

相关文章:

mysql - MySQL 表需要 ID 吗?

java - 如何在 DefaultComboBoxModel Java Swing 上设置项目 id 并显示文本?

SQL-Server:是否有可用于确定 SQL Server 备份或还原过程进度的 SQL 脚本?

sql - 如何将分钟添加到日期时间的时间部分

sql - 多个触发器与单个触发器

php - SQL - 分隔到特定范围

sql - .sql 脚本的 PostgreSQL 查询/错误记录

mysql - 在 SQL 中组合具有不同属性和大小的表

c# - 如何根据 SQL 行中的值创建正确的子类

php - 使用用户输入更新 MySQL 数据库的准备语句