In Oracle, it is possible to refresh just part of the data. Aber in PostgreSQL werden materialisierte Ansichten seit 9.3 (die aktuelle Version jetzt) unterstützt, die nicht so lang ist. Also frage ich mich: Ist es möglich, nur einen Teil der Daten in der materialisierten Ansicht in PostgreSQL 9.3 zu aktualisieren? Wenn ja, wie geht das?Ist es möglich, eine materialisierte Ansicht in PostgreSQL teilweise zu aktualisieren?
Antwort
PostgreSQL unterstützt noch keine progressiven/partiellen Aktualisierungen von materialisierten Ansichten.
9.4 fügt REFRESH MATERIALIZED VIEW CONCURRENTLY
hinzu, aber es muss noch vollständig regeneriert werden.
Wir hoffen, dass wir Unterstützung in 9.5 sehen, wenn jemand enthusiastisch genug ist. Es ist jedoch nur möglich, dies ohne benutzerdefinierte Trigger/Regeln für einfache materialisierte Ansichten zu tun, und spezielle Unterstützung wäre sogar erforderlich, um Dinge wie die inkrementelle Aktualisierung eines count(...) ... GROUP BY ...
zu handhaben.
Die Oracle-Antwort, auf die Sie verweisen, ist jedoch keine inkrementelle Aktualisierung. Es ist Aktualisieren von Partitionen. Damit PostgreSQL dies nativ unterstützt, müsste es zuerst eine echte deklarative Partitionierung unterstützen - was es nicht tut, obwohl wir darüber diskutieren, ob es für 9.5 möglich ist.
Ich bin gerade auf ein ähnliches Problem gestoßen. Von Craig's answer lernen, dass es nicht möglich ist, habe ich einen Workaround verwendet. Ich dekonstruiert die materialisierte Ansicht und schloss sich die einzelnen Teile in einem VIEW
:
- eine
MATERIALIZED VIEW
in Frage für jede Spalte erstellen (material_col1
,material_col2
, etc.), eine gemeinsameid
Spalte. - Verwenden Sie einen regelmäßigen
VIEW
(fake_materialized_view
) auf derid
Spalte derMATERIALIZED VIEW
s Tabellen verknüpft REFRESH MATERIALIZED VIEW
nach Bedarf- Verwenden Sie Ihre Abfrage auf
fake_materialized_view
statt
Die VIEW
würde etwas wie folgt aussehen:
CREATE VIEW fake_materialized_view AS
SELECT m1.id, m1.col1, m2.col2
FROM material_col1 as m1 LEFT JOIN
material_col2 as m2
ON m1.id = m2.id;
Leider ist das nur hilfreich für "partitionierte Spalten", nicht für "partitionierte Zeilen" (die nicht notwendigerweise einfach definierbaren Partitionen und eher einzelnen Zeilen zugeordnet sind) –
@AndreasDietrich Ich denke, man könnte etwas Ähnliches mit 'UNION ALL' machen. .. – n1000
Können Sie ein Beispiel dafür nennen, was Sie meinen? Ich dachte, der Punkt einer materialisierten Ansicht wäre, nur einen Teil der Daten zu zeigen. – Lucas
Diese Antwort, die Sie für Oracle verknüpft haben, ist nicht sehr überzeugend. Es besagt, dass Sie eine der Partitionen für eine partitionierte MV erzwingen können. Da die Partitionierung in PostgreSQL nicht wirklich eine eingebaute Funktion ist, sondern etwas, das Sie selbst in die Rollen gebracht haben, könnte man den gleichen Ansatz auch in Postgres finden. – Thilo