0Pricing
SQL Academy · Урок

Материализованные представления и стратегии 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 — локальная установка не требуется.

Все уроки этого курса

  1. Обычные представления: логическое повторное использование
  2. Обновляемые представления и триггеры INSTEAD OF
  3. Материализованные представления и стратегии REFRESH
  4. Когда нужна предварительная агрегация
← Назад к SQL Academy