Требуется ли явное обновление View в PostgreSQL?

Ответ

Обычные View (представления) не требуют явного обновления. Они являются виртуальными таблицами, основанными на SQL-запросе, и автоматически отражают актуальные данные из базовых таблиц при каждом обращении.

Когда требуется действие:

  1. При изменении схемы базовых таблиц (удаление/переименование столбцов) представление становится невалидным. Его необходимо пересоздать.
  2. Для материализованных представлений (MATERIALIZED VIEW) данные сохраняются физически на момент создания и требуют явного обновления командой REFRESH.

Примеры:

-- Создание обычного View
CREATE VIEW active_users AS
SELECT id, username FROM users WHERE is_active = true;
-- Данные всегда актуальны при SELECT * FROM active_users

-- Пересоздание View при изменении схемы
CREATE OR REPLACE VIEW active_users AS
SELECT id, username, email FROM users WHERE is_active = true;

-- Обновление материализованного View
REFRESH MATERIALIZED VIEW CONCURRENTLY user_stats;

Почему: Обычные View — это сохранённые запросы, а материализованные — это снимки данных для производительности, которые устаревают.

Ответ 18+ 🔞

Давай разжую эту тему, как будто я тебе на кухне объясняю, пока чайник закипает. Представь, что обычный VIEW — это не таблица, а, блядь, окно. Просто окно, в которое ты смотришь.

Ты подходишь к этому окну, а там вид на твой двор — то есть на реальные таблицы users, orders, какие угодно. Ты каждый раз, когда в окно смотришь, видишь текущую картину. Кто-то во дворе машину поставил — ты видишь. Убрал — ты видишь. Окно само не пачкается и не меняется, оно просто показывает то, что есть прямо сейчас. Поэтому его не надо "обновлять" или "мыть". Подошёл, глянул — и всё, данные свежие.

Когда же надо шевелиться, сука?

  1. Когда ты сам этот двор перекопал. Допустим, в таблице users был столбец phone_number, а ты его взял и нахуй удалил. А твоё окошко-VIEW как раз на этот столбец смотрело. Ты теперь подходишь к окну, а там ошибка, типа "стекло разбито". Окно стало невалидным. Что делать? Переустановить окно! То есть выполнить CREATE OR REPLACE VIEW ... с новым запросом, который уже на новые столбцы смотрит.

  2. Когда у тебя не окно, а фотография. Вот это, ёпта, важный момент! Есть же материализованные представления (MATERIALIZED VIEW). Это не окно, а, блядь, снимок, фотография того двора, которую ты сделал вчера. И она висит у тебя на холодильнике. Удобно? Да, потому что смотреть на фото быстро. Но если сегодня во дворе снег выпал, а на фото ещё трава зелёная — то это пиздец, информация устарела. Вот такие "фотографии" требуют явного обновления. Надо сказать базе: "Слушай, иди, блядь, сделай новый свежий снимок!" Командой REFRESH MATERIALIZED VIEW .... Иначе будешь жить в прошлом, как лох.

Короче, на пальцах:

-- Окно (всегда актуально). Ничего обновлять не надо.
CREATE VIEW active_users AS
SELECT id, username FROM users WHERE is_active = true;
-- Просто смотри в него каждый раз: SELECT * FROM active_users

-- Фотография (застывший снимок на момент создания). Требует обновления!
CREATE MATERIALIZED VIEW user_stats AS
SELECT user_id, COUNT(*) as order_count FROM orders GROUP BY user_id;
-- Со временем данные тут — старьё. Надо переснять:
REFRESH MATERIALIZED VIEW CONCURRENTLY user_stats;

Итог: Если у тебя простое VIEW (окно) — расслабься, оно живёт само. Беспокоиться надо только если ты схему базовых таблиц ломаешь, или если ты намудрил с материализованным VIEW (фотографией), которую нужно периодически тыкать, чтобы она актуальной была. Всё, понятно? Иди чай пей.