web-dev-qa-db-fra.com

Comment effectuer une actualisation incrémentielle d'une vue matérialisée PostgreSQL?

Je regarde les documents PostgreSQL où:

REFRESH MATERIALIZED VIEW remplace complètement le contenu d'une vue matérialisée. L'ancien contenu est supprimé.

Cependant, depuis 9.5 je crois, il existe un moyen de mettre à jour un MV sans avoir à régénérer toutes les données.

7

Il n'y a pas de INCREMENTAL, c'est très simple .. De les docs

REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name
    [ WITH [ NO ] DATA ]

Peut-être que vous le confondez avec CONCURRENTLY qui concerne la concurrence (verrouillage) et non la minimisation des mises à jour.

Actualisez la vue matérialisée sans verrouiller les sélections simultanées sur la vue matérialisée. Sans cette option, une actualisation qui affecte un grand nombre de lignes aura tendance à utiliser moins de ressources et à se terminer plus rapidement, mais pourrait bloquer d'autres connexions qui tentent de lire à partir de la vue matérialisée. Cette option peut être plus rapide dans les cas où un petit nombre de lignes est affecté.

Si vous avez besoin d'une actualisation incrémentielle, utilisez une table pour stocker les résultats et joignez-la à la source en insérant uniquement les lignes qui 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
);

ou utilisez le plus récent ON CONFLICT UPDATE ou ON CONFLICT DO NOTHING sur INSERT.

11
Evan Carroll