В SQL есть два типа представлений:
Обычные View удобны для абстракции сложности, упрощения доступа, объединения данных из нескольких источников. Они не ускоряют запросы, т.к. всегда формируются на лету.
Материализованные View дают выигрыш в производительности для сложных отчетов и аналитики, где важно не ждать агрегаций и джойнов каждый раз. Их надо вручную или по расписанию актуализировать, чтобы данные не устаревали.
CREATE VIEW active_users AS SELECT id, name FROM users WHERE status = 'active';
CREATE MATERIALIZED VIEW active_users_agg AS SELECT country, COUNT(*) as cnt FROM users WHERE status = 'active' GROUP BY country; -- Для обновления: REFRESH MATERIALIZED VIEW active_users_agg;
Можно ли обновлять данные в VIEW и как это зависит от типа VIEW?
Часто ошибочно считают, что VIEW полностью идентичны таблицам по обновляемости. НА САМОМ ДЕЛЕ:
REFRESH, иначе возникает рассогласование данных.История 1
BI-отчет строился через обычный VIEW с несколькими JOIN и агрегатами. После увеличения нагрузки время построения отчёта выросло до десятков минут. Системный аналитик предложил материализованное представление, что мгновенно сократило время до секунд, т.к. данные стали храниться в отдельной таблице.
История 2
Разработчик при миграции на Oracle попытался сделать UPDATE через обычный VIEW, что вызвало ошибку: "view with group by is not updatable". Причиной было использование GROUP BY в представлении.
История 3
В одной компании забывали обновлять материализованное представление после импорта новых данных, что приводило к рассогласованию отчетов между разными пользователями, так как аналитика работала со старыми данными из этого VIEW. После добавили автоматический REFRESH по расписанию.