Widok zmaterializowany

Widok, którego wynik jest fizycznie zapisany na dysku i odświeżany okresowo. Przyspiesza ciężkie zapytania kosztem aktualności danych.

Widok zmaterializowany (ang. materialized view) to widok, którego wynik nie jest liczony za każdym razem od zera, tylko raz policzony i fizycznie zapisany na dysku — jak zwykła tabela. Kiedy odpytujesz taki widok, baza nie uruchamia ponownie ciężkiego SELECT z trzema JOIN i agregacją, tylko czyta gotowe dane. Cena za tę szybkość jest jedna: dane mogą być nieaktualne, dopóki ich świadomie nie odświeżysz.

To jest kluczowa różnica między zwykłym widokiem (view) a zmaterializowanym. Zwykły widok to tylko zapisane zapytaniealias, który baza rozwija i wykonuje przy każdym odwołaniu. Widok zmaterializowany to migawka wyniku zamrożona w czasie. Świetnie nadaje się tam, gdzie te same kosztowne obliczenia powtarzają się dziesiątki razy, a dane nie muszą być świeże co do sekundy: raporty, dashboardy, podsumowania sprzedaży za wczoraj, rankingi.

Jak to działa w praktyce

W PostgreSQL tworzysz go tak: CREATE MATERIALIZED VIEW sprzedaz_dzienna AS SELECT data, SUM(kwota) FROM zamowienia GROUP BY data;. Od tej chwili zapytania do sprzedaz_dzienna są błyskawiczne. Gdy chcesz przeliczyć dane na nowo, wołasz REFRESH MATERIALIZED VIEW sprzedaz_dzienna; — zwykle z crona, w nocy albo co godzinę.

Haczyk: zwykły REFRESH blokuje odczyt widoku na czas przeliczania. Jeśli masz na widoku unikalny indeks, użyj REFRESH MATERIALIZED VIEW CONCURRENTLY — odświeża w tle, bez blokowania zapytań, choć trwa dłużej. To różnica między dashboardem, który na chwilę zamarza, a takim, który działa bez przerwy.

Częste błędy i mity

  • Mit: dane odświeżają się same. Nie. W PostgreSQL musisz wywołać REFRESH ręcznie albo schedulerem. Oracle ma opcję FAST REFRESH i ON COMMIT, ale to inny mechanizm — nie zakładaj go w każdej bazie.
  • Mit: to zawsze szybsze. Przy małych tabelach narzut utrzymania bywa większy niż zysk. Materialized view ma sens przy ciężkich agregacjach na dużych danych.
  • Pułapka świeżości: użytkownik widzi liczby sprzed odświeżenia. Jeśli ktoś podejmuje decyzje na danych „na żywo”, materialized view go oszuka. Zawsze dopytaj, jak stare dane są akceptowalne.
  • Miejsce na dysku: to realna kopia danych. Kilka dużych widoków potrafi sporo zająć.

Warto kojarzyć pojęcia powiązane: zwykły widok (view), tabela tymczasowa, indeks, cache zapytań, ETL i hurtownia danych. W praktyce widok zmaterializowany to taki cache na poziomie bazy — z tymi samymi zaletami i tym samym odwiecznym problemem każdego cache’u: kiedy go unieważnić.