次のような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の先頭に置くことができます。現在のように最後に条件を配置した場合、最早または最遅で行が除外されますか?何が速いですか?
基本的に私がやっていることは、a
やb
などではなく、より早く表示されるCTEで(k
ではなく)、データを順番にプリフェッチするか、列を事前計算しています後でこれらのCTEで使用します。
この質問がまだ漠然としていないことを願っています。
CTEはPostgresでは最適化フェンスとしてポーズをとります。
各CTEは、個別に計画、実行、具体化されます。後のCTEの述語は、notで、以前のCTEに表示されます。行をできるだけ早く削除するための条件を配置します(例ではa
またはb
)。
または、Postgresでより積極的な最適化を可能にするためにサブクエリで書き換えます。 (ただし、関係のない行はできるだけ早期に削除する必要があります。最適化はこれまでしか行われません...)
クレイグのブログ投稿の詳細: