我在 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
子句中以正确的顺序放置表来强制执行顺序:
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
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
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)
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/