Postgresql
Postgres JOIN 條件與 WHERE 條件
Postgres新手在這裡。
我想知道這個查詢是否經過優化?我試圖只加入 100% 必要的值,並將所有動態條件留在 WHERE 子句中。見下文。
SELECT * FROM myapp_employees JOIN myapp_users ON myapp_users.user_id=myapp_employees.user_id JOIN myapp_contacts_assoc ON myapp_contacts_assoc.user_id=myapp_users.user_id JOIN myapp_contacts ON myapp_contacts.contact_id=myapp_contacts_assoc.contact_id WHERE myapp_contacts.value='test@gmail.com' AND myapp_contacts.type=(1)::INT2 AND myapp_contacts.is_primary=(1)::INT2 AND myapp_contacts.expired_at IS NULL AND myapp_employees.status=(1)::INT2 AND myapp_users.status=(1)::INT2 LIMIT 1;
注意:對於上下文,此過程正在檢查使用者是否也是員工(提升的權限/不同的使用者類型)。
無論如何,這是正確的方法嗎?JOIN ON 是否應該包含更多語句,例如檢查 expired_at IS NULL 嗎?為什麼或為什麼這沒有意義?
從邏輯上講,將條件放在 an 的 join 子句
INNER JOIN
還是WHERE
相同的子句中根本沒有區別SELECT
。效果是一樣的。(不是這種情況
OUTER JOIN
!)在使用預設設置進行操作時,它對查詢計劃或性能也沒有影響。Postgres 可以自由地重新排列連接和
JOIN
&WHERE
條件以尋求最佳查詢計劃——只要表的數量不大於join_collapse_limit
(預設8
)。細節:為了可讀性和可維護性
JOIN
,將連接表的條件放在相應的子句中,將一般條件放在子句中是有意義的WHERE
。您的查詢看起來很好。不過,我會使用表別名來減少噪音。
小細節:
int2 '1'
甚至1::int2
比(1)::INT2
. 與定義明確的數字數據類型的值相比,普通的數字常量1
也足夠了。