2014-09-03 9 views
14

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?

+1

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

+0

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

Antwort

20

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.

4

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:

  1. eine MATERIALIZED VIEW in Frage für jede Spalte erstellen (material_col1, material_col2, etc.), eine gemeinsame id Spalte.
  2. Verwenden Sie einen regelmäßigen VIEW (fake_materialized_view) auf der id Spalte der MATERIALIZED VIEW s Tabellen verknüpft
  3. REFRESH MATERIALIZED VIEW nach Bedarf
  4. 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; 
+0

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) –

+0

@AndreasDietrich Ich denke, man könnte etwas Ähnliches mit 'UNION ALL' machen. .. – n1000

Verwandte Themen