Postgresql

CTE 在哪裡放置 where 子句以更快地過濾行(在 postgresql 中)?

  • October 15, 2020

我有 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 子句放在aCTE 的開頭。如果我像現在一樣將條件放在最後,它會最早還是最晚過濾掉行?什麼更快?

基本上我所做的是,在較早出現的 CTE 中,例如aor b,(而不是k),我正在預取數據或預計算列,以便稍後在以下 CTE 中使用它們。

希望這個問題仍然不會太模糊。

CTE在 Postgres 中充當優化柵欄。

每個 CTE 都是單獨計劃、執行和實現的。較晚 CTE 的謂詞在較早的 CTE 中可見。放置條件以儘早消除行(ab在您的範例中)。

或者用子查詢重寫以允許在 Postgres 中進行更積極的優化。(但您仍然應該儘早消除不相關的行,優化只能到此為止……)

克雷格博文中的詳細資訊:

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