Ersetzen Sie eine materialisierte Ansicht in Postgres


23

Ich habe eine materialisierte Ansicht, in Postgres 9.3der ich mit neuen Spalten aktualisieren möchte. Andere materialisierte Ansichten hängen jedoch auch von dieser Ansicht ab, und die Fehlermeldung gibt an, dass das Löschen einer Ansicht nicht möglich ist, wenn andere Objekte davon abhängig sind.

FEHLER: materialisierte Ansicht latest_charges kann nicht gelöscht werden, da andere Objekte davon abhängen

Aus der Dokumentation geht auch hervor, dass das Schlüsselwort REPLACE für eine materialisierte Ansicht nicht gültig ist. Gibt es eine Verknüpfung außer dem Löschen aller abhängigen Objekte und dem Neuerstellen der einzelnen Objekte?


7
Traurigerweise denke ich, dass Sie es nicht schaffen, sie alle fallen zu lassen und wieder aufzubauen.
Craig Ringer

@CraigRinger daran interessiert, dies als Antwort hinzuzufügen?
Dezso

Antworten:


17

Ab PostgreSQL 9.4: Anders als in der Dokumentation von CREATE VIEW wird in der Dokumentation von CREATE MATERIALIZED VIEW das Schlüsselwort REPLACE NICHT erwähnt. Es scheint keine Abkürzung zu geben, außer alle abhängigen Objekte fallen zu lassen und jedes neu aufzubauen.

Wenn Sie das tun, kann ich nur zwei kleine Dinge empfehlen:

  1. Verwenden Sie DROP MATERIALIZED VIEW blabla CASCADE, um eine Liste aller abhängigen Objekte abzurufen
  2. Führen Sie das Löschen und Neuerstellen aller abhängigen Objekte in einer Transaktion durch.

1
Danke, genau so habe ich es gemacht. Es ist nur mühsam, klar zu bleiben, da ich eine materialisierte Basisansicht für analytische Zwecke erstelle, die in vielen anderen Ansichten wiederverwendet wird. Diese Basisansicht ändert sich selten, aber diejenigen, die davon abhängen, ändern sich täglich.
John

4

In meiner Situation ziehe ich es vor, die Tropfen mit einer Ansichtsebene zu begrenzen:

  1. Erstellen Sie eine Kopie der materialisierten Ansicht mit dem Suffix "_new" und verwenden Sie für die Leistung auch "WITH NO DATA". Stellen Sie sicher, dass alle Indizes auch mit dem Suffix und anderen abhängigen Objekten erstellt werden, die über DROP ... CASCADE ermittelt wurden
  2. Erstellen Sie eine Ansicht für die neue materialisierte Ansicht, um die Abstraktionsebene bereitzustellen, sodass ich sie nur an einer Stelle ändern muss
  3. ÄNDERN Sie die vorhandenen Abhängigkeiten, um stattdessen auf die neue Ansicht zu verweisen (aktualisieren Sie die Daten, falls erforderlich, vorher).
  4. Löschen Sie die ursprüngliche materialisierte Ansicht und die Indizes, die jetzt keine Abhängigkeiten haben sollten
  5. Ändern Sie die materialisierte Ansicht und die Indizes, um das Suffix zu löschen und die ursprünglichen Namen wiederherzustellen

z.B.

create table test (myfield int);
insert into test values (1);
create materialized view mv_test as select myfield from test;
create view v_test as select myfield from mv_test;
select * from v_test;
create materialized view mv_test_new as select myfield, myfield+1 as myfield2 from test;
alter view v_test rename to v_test_old;
alter materialized view mv_test rename to mv_test_old;
create view v_test as select myfield,myfield2 from mv_test_new;
select * from v_test;
alter materialized view mv_test_new rename to mv_test;
drop view v_test_old; -- when ready
drop materialized view mv_test_old; -- when ready

Die letzten beiden Schritte sind mir nicht klar. Ist 4 ein Satz, der in 5 übergeht? Könnten Sie ein kurzes Beispiel mit einigen benannten Matviews und Views machen?
Kimbo305

korrigierte den abgeschnittenen Satz und fügte ein Beispiel hinzu
RuiDC

1

In PgAdmin (Version 4.x) konnte ich die Definition im Eigenschaftenfeld leicht ändern (ich habe eine where-Klausel hinzugefügt). Ihr Problem könnte so gelöst werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.