Postgresql
CTE 在哪裡放置 where 子句以更快地過濾行(在 postgresql 中)?
我有 CTE 的功能,如下所示:
function param(p_userId, p_templateId) with a(select...), b (select..), c (insert..returning..), d (update..returning..), ...k(select..) insert ... select * from k where userId = p_userId and templateId = p_templateId
我可以將 where 子句放在
a
CTE 的開頭。如果我像現在一樣將條件放在最後,它會最早還是最晚過濾掉行?什麼更快?基本上我所做的是,在較早出現的 CTE 中,例如
a
orb
,(而不是k
),我正在預取數據或預計算列,以便稍後在以下 CTE 中使用它們。希望這個問題仍然不會太模糊。
CTE在 Postgres 中充當優化柵欄。
每個 CTE 都是單獨計劃、執行和實現的。較晚 CTE 的謂詞在較早的 CTE 中不可見。放置條件以儘早消除行(
a
或b
在您的範例中)。或者用子查詢重寫以允許在 Postgres 中進行更積極的優化。(但您仍然應該儘早消除不相關的行,優化只能到此為止……)
克雷格博文中的詳細資訊: