隐式连接与 Postgres 中的显式连接一样有效吗?

use*_*956 2 postgresql join execution-plan

通常这样写很方便:

SELECT * 
FROM t1   # ... +many more tables
INNER JOIN t2 ON (t1.id = t2.col)
INNER JOIN t3 ON (t1.id = t3.col)
INNER JOIN t4 ON (t1.id = t4.col)
...
Run Code Online (Sandbox Code Playgroud)

作为带条件的交叉连接:

SELECT * 
FROM t1, t2, t3, t4   # ... +many more tables
WHERE
       t1.id = t2.col
   AND t1.id = t3.col
   AND t1.id = t4.col
   # +include matches on columns of other tables
Run Code Online (Sandbox Code Playgroud)

但是,交叉连接的简单实现将比内部连接具有更高的时间复杂度。Postgres 是否将第二个查询优化为与第一个查询具有相同时间复杂度的查询?

Erw*_*ter 6

我会使用显式JOIN语法,但减少噪音:

SELECT *  -- really? *all* columns?
FROM   t1
JOIN   t2 ON t1.id = t2.col
JOIN   t3 ON t1.id = t3.col
JOIN   t4 ON t1.id = t4.col
-- ... more tables
WHERE ...
Run Code Online (Sandbox Code Playgroud)

JOIN子句中放置连接两个表的条​​件。
WHERE子句中放置其他条件。

INNER是一个噪音词。连接条件周围不需要括号。

回答你的问题

隐式连接与 Postgres 中的显式连接一样有效吗?

是的。效率没有区别。Postgres 通常可以自由地重新排列连接操作的顺序,并以它认为合适的任何顺序应用JOINWHERE条件。手册:

显式内部连接语法(INNER JOINCROSS JOIN或 unadorned JOIN)在语义上与在 中列出输入关系相同FROM,因此它不限制连接顺序。

OUTER此处不适用的连接有一些特殊注意事项。
并注意一些限制

既然你提到:

+更多的桌子

...您可能需要考虑如何通过仔细选择显式连接的顺序和条件的放置来优化计划时间查询执行时间。您可能希望使用子查询、CTE、混合显式和隐式连接、在FROM子句项组之间使用括号或使用配置设置以获得最佳结果。

有关的:


归档时间:

查看次数:

2444 次

最近记录:

4 年,6 月 前