私はPostgreSQLのドキュメントを見ています:
マテリアライズドビューの更新は、マテリアライズドビューの内容を完全に置き換えます。古い内容は破棄されます。
ただし、9.5以降では、すべてのデータを再生成せずにMVを更新する方法があります。
INCREMENTAL
はありません。非常にシンプルです。From the docs
REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name
[ WITH [ NO ] DATA ]
おそらく、同時実行(ロック)に関するCONCURRENTLY
と混同しており、更新を最小限に抑えていません。
マテリアライズドビューでの同時選択をロックアウトせずにマテリアライズドビューを更新します。このオプションを使用しないと、多くの行に影響を与える更新では、使用するリソースが少なくなり、完了までの時間が短くなりますが、マテリアライズドビューから読み取ろうとしている他の接続がブロックされる可能性があります。影響を受ける行の数が少ない場合、このオプションはより高速になる場合があります。
増分更新が必要な場合は、テーブルを使用して結果を保存し、それをソースに対して結合して、NOT EXISTS
、
INSERT INTO materialized_resultset
SELECT foo,bar,baz
FROM src
WHERE NOT EXISTS (
SELECT 1
FROM materialized_resultset AS mr
WHERE src.foo = mr.foo
);
または新しいON CONFLICT UPDATE
またはON CONFLICT DO NOTHING
(INSERT
)。