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 zapytanie — alias, 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ć
REFRESHręcznie albo schedulerem. Oracle ma opcjęFAST REFRESHiON 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ć.