
Как мы убрали очередь из REFRESH MATERIALIZED VIEW в PostgreSQL
makushevski 6 минут назад Как мы убрали очередь из REFRESH MATERIALIZED VIEW в PostgreSQL Средний 8 мин 82 Блог компании Контур PostgreSQL * SQL * Базы данных * Высоконагруженные системы * Кейс Привет, Хабр! Меня зовут...
GPT-5.6 31 Temmuz 2026'da yayınlanacak mı?
В сфере искусственного интеллекта произошло заметное событие. makushevski 6 минут назад Как мы убрали очередь из REFRESH MATERIALIZED VIEW в PostgreSQL Средний 8 мин 82 Блог компании Контур PostgreSQL * SQL * Базы данных * Высоконагруженные системы * Кейс Привет, Хабр! Меня зовут Денис, я инженер-программист в Контуре. TL;DR:У нас был долгий REFRESH MATERIALIZED VIEW: один запуск мог идти около часа, а повторные запуски вставали в очередь и держали соединения.
CONCURRENTLY помогал не блокировать чтение из materialized view, но не решал проблему очереди одинаковых REFRESH. Мы сделали механизм в PostgreSQL: триггерами отмечаем изменения в зависимых таблицах, храним зависимости каждой MV в служебной таблице, а перед обновлением берём pg_try_advisory_xact_lock по конкретной MV. Если lock не удалось взять — значит, обновление уже идёт, и второй REFRESH не ждёт в очереди, а пропускается.
Технические детали
Несколько лет назад, пока проект, на котором я работаю, был совсем молодым и быстро рос, у нас была единственная база данных — PostgreSQL. Специфика проекта такая, что нам нужно строить сложные запросы и отдавать результат напрямую пользователю. Проект развивался, количество документов и пользователей росло, и в какой-то момент наши запросы с кучей джойнов и функций начали заметно замедляться.
При этом это была не внутренняя аналитика, а реальные данные, которые пользователь запрашивал через UI, поэтому время выполнения запроса играло большую роль. Все простые способы оптимизации на тот момент уже не работали, и мы рассматривали два решения. Первое — глобально изменить подход: использовать другую БД или изменить схему хранения данных.
Второе — использовать материализованное представление. Мы понимали, что данных будет всё больше, и вариант с глобальным изменением архитектуры всё равно неизбежен, но проблему нужно было решать прямо сейчас. Поэтому какое-то время нас спасал materialized view.
Отраслевые последствия
Далее для простоты я буду называть его просто MV. В PostgreSQL можно сохранить запрос как view 1, который живёт прямо в БД. Вместо того чтобы постоянно писать один и тот же запрос, мы сохраняем его под определённым именем и выполняем простой SELECT * FROM view_name.
В этот момент PostgreSQL выполняет запрос, лежащий в основе view. А вот materialized view 2 — это, по сути, закешированный результат выполнения запроса. Результат сохраняется как таблица в базе данных.
К этой таблице можно обращаться точно так же: SELECT * FROM materialized_view_name. Такой запрос обычно выполняется намного быстрее, потому что результат уже заранее сохранён. Хранимые процедуры и view иногда считают анти-паттерном, если они хранят бизнес-логику: в таком случае логика оказывается распределена между приложением и базой.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





