Postgresql

Postgres JOIN 條件與 WHERE 條件

  • April 17, 2019

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也足夠了。

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