Postgresql
隱式連接是否與 Postgres 中的顯式連接一樣有效?
寫起來通常很方便:
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 通常可以自由地重新排列連接操作的順序,並以它認為合適的任何順序應用
JOIN
和WHERE
條件。手冊:顯式內部連接語法(
INNER JOIN
,CROSS JOIN
或 unadornedJOIN
)在語義上與在 中列出輸入關係相同FROM
,因此它不限制連接順序。
OUTER
對於此處不適用的連接有一些特殊注意事項。並註意一些限制:
- 顯式連接比隱式連接更強。混合兩者時可能會產生副作用- 除非您了解其中的含義,否則您應該避免這種情況。看:
- 為什麼這個隱式連接的計劃與顯式連接不同?
- 做什麼$$ FROM x, y $$在 Postgres 中是什麼意思?
- 列表中有多個
join_collapse_limit
項目FROM
(目前預設為8),Postgres 從對最佳查詢計劃的詳盡搜尋切換到通用方法。因此,顯式連接項的順序變得更加重要——甚至具有指導意義。既然你提到:
+更多桌子
…您可能需要考慮如何通過仔細選擇顯式連接的順序和條件的放置來優化規劃時間*和查詢執行時間。*您可能希望使用子查詢、CTE、混合顯式和隱式連接、在
FROM
子句項組之間使用括號或使用配置設置以獲得最佳結果。有關的: