SQL Academy · Lekcja

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

Lekcja 3 z 414 kroki

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?

Bezpłatny start

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

  1. Widoki zwykłe: logiczne ponowne użycie
  2. Widoki aktualizowalne i triggery INSTEAD OF
  3. Widoki zmaterializowane i strategie REFRESH
  4. Kiedy wykonywać agregację wstępną
← Powrót do SQL Academy