Inhalt

../../_images/spielzeug-auto.jpg

Views: materialized

Eine »materialized view« (materialisierte Sicht) speichert das Ergebnis einer Abfrage. Die Abfrage wird ausgeführt und verwendet, die View zum **Zeitpunkt** der Befehlsausgabe um das Ergebnis zusammenzustellen und bereit zu halten. Das Ergebnis ändert sich bis zu einem Refresh nicht, ist also nur für Relationen geeignet, deren Inhalt sich eher selten ändert. Zu einem späteren Zeitpunkt kann mit einem Refresh eine Aktualisierung erfolgen.

Tabellen: gerichte und gaeste

CREATE TABLE gerichte
( gericht_id SERIAL PRIMARY KEY
  , bezeichnung text
);

CREATE TABLE gaeste
( gast_id SERIAL
  , besuch_am date
  , gericht_id int REFERENCES gerichte (gericht_id)
);
INSERT INTO gerichte (bezeichnung)
VALUES ('Schnitzel'), ('Spinat mit Ei'), ('Gulasch'), ('Reis'), ('Nudeln'), ('Pommes');

INSERT INTO gaeste(besuch_am, gericht_id)
SELECT floor(abs(sin(n)) * 365) :: int + date '2018-01-01'
 , ceil(abs(sin(n :: float * n))*6) :: int
 FROM generate_series(1,500000) AS rand(n);

View (normal)

CREATE VIEW v_gerichte AS
  SELECT bezeichnung, count(*)
  FROM gerichte JOIN gaeste USING (gericht_id)
  GROUP BY bezeichnung
  ORDER BY 1;

View (materialized)

CREATE MATERIALIZED VIEW m_gerichte AS
  SELECT bezeichnung, count(*)
  FROM gerichte JOIN gaeste USING (gericht_id)
  GROUP BY bezeichnung
  ORDER BY 1;

View (materialized) aktualisieren

REFRESH MATERIALIZED VIEW m_gerichte;

Zeitmessung

Für den Vergleich muss eventuell die Zeitmessung aktiviert werden:

\timing