web-dev-qa-db-ja.com

PostgreSQLマテリアライズドビューの増分更新を行う方法は?

私はPostgreSQLのドキュメントを見ています:

マテリアライズドビューの更新は、マテリアライズドビューの内容を完全に置き換えます。古い内容は破棄されます。

ただし、9.5以降では、すべてのデータを再生成せずにMVを更新する方法があります。

7

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 NOTHINGINSERT)。

11
Evan Carroll