Материализованные представления и стратегии REFRESH
Сохраняйте результат ресурсоёмкого запроса с помощью MATERIALIZED VIEW и обновляйте его по расписанию или по требованию
«Материализованные представления и стратегии REFRESH» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Материализованное представление = сохранённый результат
В отличие от обычного представления, материализованное представление сохраняет результат своего SELECT на диске. Запросы обращаются к сохранённым данным — это быстро. Обновляйте по требованию.
CREATE MATERIALIZED VIEW daily_revenue AS
SELECT date_trunc('day', created_at) AS day,
SUM(total) AS revenue
FROM orders
GROUP BY 1;Запросы
Запросы к материализованным данным — это обычные SELECT:
SELECT * FROM daily_revenue WHERE day >= NOW() - INTERVAL '30 days';REFRESH MATERIALIZED VIEW
Пересчитайте результат. Представление блокируется монопольно:
REFRESH MATERIALIZED VIEW daily_revenue;
-- Selects on the view block during refresh.REFRESH MATERIALIZED VIEW CONCURRENTLY
Обновление без блокировки — читатели продолжают получать старые данные, пока новые не будут готовы. Для этого нужен уникальный индекс на представлении:
CREATE UNIQUE INDEX ON daily_revenue (day);
REFRESH MATERIALIZED VIEW CONCURRENTLY daily_revenue;Индексы материализованных представлений
Материализованное представление можно индексировать так же, как любую таблицу, — это ускоряет запросы:
CREATE INDEX daily_revenue_day_idx ON daily_revenue (day DESC);Когда следует материализовать
Используйте материализованные представления, когда:
- Базовый запрос является дорогим
- Результат может быть слегка устаревшим
- Между обновлениями запрос выполняется много раз
Плановое обновление
Встроенного планировщика нет. Используйте pg_cron, задание cron в ОС или планировщик приложения:
-- Via pg_cron extension:
SELECT cron.schedule('refresh_daily', '0 1 * * *', 'REFRESH MATERIALIZED VIEW CONCURRENTLY daily_revenue;');Инкрементальное обновление
В PostgreSQL нет встроенного инкрементального обновления — каждый REFRESH пересчитывает результат с нуля. Для инкрементальной агрегации рассмотрите:
- Созданные вручную «сводные таблицы» на основе триггеров
- Непрерывные агрегаты TimescaleDB
- Расширение pg_ivm (инкрементальные материализованные представления)
Чтение базовых таблиц без влияния на чтение
Обновление CONCURRENT читает базовые таблицы в снимке транзакции и не блокирует их. Однако само обновление может быть медленным на огромных объёмах данных.
Использование диска
Материализованное представление удваивает объём хранения своих данных. Планируйте место на диске соответственно.
Сочетание с секционированием
Для огромных временных рядов секционируйте материализованное представление (или используйте TimescaleDB):
CREATE MATERIALIZED VIEW orders_summary AS ... ;
CREATE INDEX ON orders_summary (day);
-- For very large views, consider regular table + manual upsert pattern.Когда не следует использовать
Если Ваши запросы допускают получение свежих данных через SQL, а базовый запрос и так выполняется быстро, избавьте себя от обслуживания обновлений. Материализованные представления — это компромисс: устаревание в обмен на скорость.
Итоги
Материализованные представления кэшируют результаты запросов.
- Хранятся на диске, индексируются и работают быстро
- Выполняйте REFRESH вручную или по расписанию
- CONCURRENTLY требует индекса UNIQUE
- Используйте для дорогих агрегаций, допускающих небольшое устаревание
Быстрая проверка
Что требуется для REFRESH MATERIALIZED VIEW CONCURRENTLY, но не требуется для обычного REFRESH?
Часто задаваемые вопросы
Урок «Материализованные представления и стратегии REFRESH» бесплатный?
Да — полный текст урока «Материализованные представления и стратегии REFRESH» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Материализованные представления и стратегии REFRESH»?
Сохраняйте результат ресурсоёмкого запроса с помощью MATERIALIZED VIEW и обновляйте его по расписанию или по требованию Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Материализованные представления и стратегии REFRESH»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обычные представления: логическое повторное использование
- Обновляемые представления и триггеры INSTEAD OF
- Материализованные представления и стратегии REFRESH
- Когда нужна предварительная агрегация