一尘不染

JOIN的ON子句中引用的表的顺序重要吗?

sql

对JOIN的ON子句中的条件进行排序的方式是否重要?

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

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

一个命令比另一个命令更可维护吗?


阅读 162

收藏
2021-03-17

共1个答案

一尘不染

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
  1. 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
  1. 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)
  1. PostgreSQL的家伙,对不起。您的 待办事项清单 说:

优化器提示(不需要)

优化器提示用于解决优化器中的问题。我们宁愿报告并解决问题。

至于比较的顺序,在任何RDBMSAFAIK中都没有关系。

尽管我个人总是尝试估计要搜索的列,然后将此列放在左侧(因为它看起来像是lvalue)。

有关更多详细信息,请参 见此答案

2021-03-17