web-dev-qa-db-ja.com

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の先頭に置くことができます。現在のように最後に条件を配置した場合、最早または最遅で行が除外されますか?何が速いですか?

基本的に私がやっていることは、abなどではなく、より早く表示されるCTEで(kではなく)、データを順番にプリフェッチするか、列を事前計算しています後でこれらのCTEで使用します。

この質問がまだ漠然としていないことを願っています。

1
Daniel Katz

CTEはPostgresでは最適化フェンスとしてポーズをとります。

各CTEは、個別に計画、実行、具体化されます。後のCTEの述語は、notで、以前のCTEに表示されます。行をできるだけ早く削除するための条件を配置します(例ではaまたはb)。

または、Postgresでより積極的な最適化を可能にするためにサブクエリで書き換えます。 (ただし、関係のない行はできるだけ早期に削除する必要があります。最適化はこれまでしか行われません...)

クレイグのブログ投稿の詳細:

3