Widoki zmaterializowane i strategie REFRESH
Trwale przechowywać wynik kosztownego zapytania za pomocą MATERIALIZED VIEW i odświeżać go zgodnie z harmonogramem lub na żądanie
Widoki zmaterializowane i strategie REFRESH to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Widok materializowany = zapisany wynik
W przeciwieństwie do zwykłego widoku widok materializowany zapisuje na dysku wynik zapytania SELECT. Zapytania korzystają z zapisanych danych — dzięki temu są szybkie. Odświeżanie odbywa się na żądanie.
CREATE MATERIALIZED VIEW daily_revenue AS
SELECT date_trunc('day', created_at) AS day,
SUM(total) AS revenue
FROM orders
GROUP BY 1;Wykonywanie zapytań
Zapytania to po prostu instrukcje SELECT wykonywane na zmaterializowanych danych:
SELECT * FROM daily_revenue WHERE day >= NOW() - INTERVAL '30 days';REFRESH MATERIALIZED VIEW
Oblicz wynik ponownie. Blokuje widok na wyłączność:
REFRESH MATERIALIZED VIEW daily_revenue;
-- Selects on the view block during refresh.REFRESH MATERIALIZED VIEW CONCURRENTLY
Odświeżanie nieblokujące — odczyty nadal korzystają ze starych danych, dopóki nowe dane nie będą gotowe. Wymaga unikatowego indeksu na widoku:
CREATE UNIQUE INDEX ON daily_revenue (day);
REFRESH MATERIALIZED VIEW CONCURRENTLY daily_revenue;Indeksy na widokach materializowanych
Widok materializowany można indeksować tak jak każdą tabelę — przyspiesza to wykonywanie zapytań:
CREATE INDEX daily_revenue_day_idx ON daily_revenue (day DESC);Kiedy materializować
Widoków materializowanych należy używać, gdy:
- Zapytanie bazowe jest kosztowne
- Wynik może być nieco nieaktualny
- Zapytanie jest wykonywane wielokrotnie między aktualizacjami
Zaplanowane odświeżanie
Brak wbudowanego harmonogramu. Należy użyć pg_cron, zadania cron systemu operacyjnego lub harmonogramu aplikacji:
-- Via pg_cron extension:
SELECT cron.schedule('refresh_daily', '0 1 * * *', 'REFRESH MATERIALIZED VIEW CONCURRENTLY daily_revenue;');Odświeżanie przyrostowe
PostgreSQL nie ma natywnego odświeżania przyrostowego — każde REFRESH oblicza wynik od początku. W przypadku agregacji przyrostowej warto rozważyć:
- Własne „tabele podsumowań” oparte na wyzwalaczach
- Agregacje ciągłe TimescaleDB
- Rozszerzenie pg_ivm (przyrostowe widoki materializowane)
Odczytywanie tabel bazowych bez wpływu na odczyty
Odświeżanie CONCURRENT odczytuje tabele bazowe w migawce transakcji — nie blokuje ich. Samo odświeżanie może jednak trwać długo w przypadku ogromnych ilości danych.
Wykorzystanie miejsca na dysku
Widok materializowany podwaja ilość miejsca zajmowanego przez swoje dane. Należy odpowiednio zaplanować miejsce na dysku.
Łączenie z partycjonowaniem
W przypadku ogromnych szeregów czasowych należy partycjonować widok materializowany (lub użyć TimescaleDB):
CREATE MATERIALIZED VIEW orders_summary AS ... ;
CREATE INDEX ON orders_summary (day);
-- For very large views, consider regular table + manual upsert pattern.Kiedy nie używać
Jeśli odczyty mogą korzystać ze świeżych danych SQL, a zapytanie bazowe jest już szybkie, warto oszczędzić sobie pracy związanej z odświeżaniem. Widoki materializowane to kompromis — mniejsza aktualność w zamian za szybkość.
Podsumowanie
Widoki materializowane buforują wyniki zapytań.
- Przechowywane na dysku, indeksowane i szybkie
- REFRESH wykonywany ręcznie lub zgodnie z harmonogramem
- CONCURRENTLY wymaga indeksu UNIQUE
- Należy ich używać do kosztownych agregacji, których niewielka nieaktualność jest dopuszczalna
Szybki sprawdzian
Czego wymaga REFRESH MATERIALIZED VIEW CONCURRENTLY, a czego nie wymaga podstawowy REFRESH?
Ucz się SQL dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 46
- Lekcje
- 183
Często zadawane pytania
Czy lekcja „Widoki zmaterializowane i strategie REFRESH” jest bezpłatna?
Tak — pełny tekst „Widoki zmaterializowane i strategie REFRESH” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Widoki zmaterializowane i strategie REFRESH”?
Trwale przechowywać wynik kosztownego zapytania za pomocą MATERIALIZED VIEW i odświeżać go zgodnie z harmonogramem lub na żądanie Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Widoki zmaterializowane i strategie REFRESH”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Widoki zwykłe: logiczne ponowne użycie
- Widoki aktualizowalne i triggery INSTEAD OF
- Widoki zmaterializowane i strategie REFRESH
- Kiedy wykonywać agregację wstępną