Postgresql

隱式連接是否與 Postgres 中的顯式連接一樣有效?

  • March 12, 2021

寫起來通常很方便:

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)
...

作為帶有條件的交叉連接:

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

但是,交叉連接的簡單實現將比內部連接具有更高的時間複雜度。Postgres 是否將第二個查詢優化為與第一個查詢具有相同時間複雜度的查詢?

我會使用顯式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 ...

JOIN在子句中放置連結兩個表的條件。

將其他條件放在WHERE子句中。

INNER是一個噪音詞。連接條件周圍不需要括號。

要回答您的問題

隱式連接是否與 Postgres 中的顯式連接一樣有效?

***是的。***效率沒有區別。Postgres 通常可以自由地重新排列連接操作的順序,並以它認為合適的任何順序應用JOINWHERE條件。手冊:

顯式內部連接語法(INNER JOIN,CROSS JOIN或 unadorned JOIN)在語義上與在 中列出輸入關係相同FROM,因此它不限制連接順序。

OUTER對於此處不適用的連接有一些特殊注意事項。

並註意一些限制

既然你提到:

+更多桌子

…您可能需要考慮如何通過仔細選擇顯式連接的順序和條件的放置來優化規劃時間*和查詢執行時間。*您可能希望使用子查詢、CTE、混合顯式和隱式連接、在FROM子句項組之間使用括號或使用配置設置以獲得最佳結果。

有關的:

引用自:https://dba.stackexchange.com/questions/198182