В чем разница между View и Materialized View в SQL?

Ответ

View (Представление) — это виртуальная таблица, основанная на результате SQL-запроса. Данные не хранятся физически, запрос выполняется каждый раз при обращении.

CREATE VIEW active_users AS
SELECT id, name, email FROM users WHERE is_active = TRUE;

Materialized View (Материализованное представление) — физически хранит результат запроса на диске. Данные обновляются периодически или по событию (REFRESH).

CREATE MATERIALIZED VIEW user_order_summary AS
SELECT user_id, COUNT(*) as order_count, SUM(total) as total_spent
FROM orders
GROUP BY user_id
REFRESH FAST ON COMMIT;

Ключевые различия:

Критерий View Materialized View
Хранение данных Нет (виртуальная) Да (физическая копия)
Производительность Медленнее (выполняет запрос) Быстрее (читает готовые данные)
Актуальность данных Всегда актуальна Требует обновления (REFRESH)
Использование диска Не требуется Требуется

Когда использовать:

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

Ответ 18+ 🔞

А, слушай, смотри, вот эта вся хуйня с вьюхами в базах данных — это вообще отдельная песня, пиздец. Ну, типа, представь, что тебе надо постоянно один и тот же ебанутый запрос писать, на три листа. Заебешься, правда?

Вот для этого и придумали View (Представление). Это типа такая виртуальная таблица, подстава для ленивых. Данные там нихуя не хранятся, понимаешь? Это просто сохранённый запрос. Каждый раз, когда ты к нему обращаешься, он, сука, заново всё выполняется. Как будто ты его только что написал.

CREATE VIEW active_users AS
SELECT id, name, email FROM users WHERE is_active = TRUE;

Вот создал ты такую вьюху active_users. И теперь вместо того чтобы везде этот WHERE is_active = TRUE городить, пишешь просто SELECT * FROM active_users. Удобно, да? И данные всегда свежие, прям с пылу с жару. Но если в основной таблице users миллион записей, а запрос сложный — каждый раз будет ебашить его по новой, производительность, блядь, на ноль.

А теперь, внимание, Materialized View (Материализованное представление). Это уже не просто подстава, а настоящая разводка, но в хорошем смысле. Это уже не виртуальная, а самая что ни на есть реальная, физическая таблица, которая лежит на диске и хранит результат того запроса. Овердохуища быстрее, потому что читает уже готовое.

CREATE MATERIALIZED VIEW user_order_summary AS
SELECT user_id, COUNT(*) as order_count, SUM(total) as total_spent
FROM orders
GROUP BY user_id
REFRESH FAST ON COMMIT;

Смотри, какая хитрая жопа: посчитали разок, кто сколько заказов сделал и денег потратил, и — бац! — сохранили. Больше не считаем. Но и загвоздка есть, ёпта: данные там могут устареть. Пока ты сидишь, ковыряешься, кто-то новый заказ сделал, а в твоей материализованной вьюхе этого ещё нет. Её надо специально обновлять командой REFRESH. Вот этот REFRESH FAST ON COMMIT в примере — это чтобы она обновлялась автоматически при коммите, но так бывает не всегда, часто её вручную или по расписанию гоняют.

Ключевые различия, чтобы вообще не ебло:

Критерий View (Вьюха) Materialized View (Материализованная вьюха)
Хранение данных Нет, виртуальная, пиздец как надёжно Да, физическая копия, всё по-взрослому
Производительность Обычно медленнее, ибо запрос гоняет каждый раз Быстрее, читает с диска готовый результат
Актуальность данных Всегда актуальна, прям щас Может быть старая, пока не обновишь (REFRESH)
Использование диска Не требуется, халява Требуется, жрёт место

Когда что использовать, чтобы не быть мудаком:

  • View: Когда тебе надо просто спрятать сложную логику, чтобы в запросах не городить огород. Или чтобы ограничить доступ — дать пользователю вьюху только с нужными столбцами, а всю таблицу не показывать. Данные всегда свежие.
  • Materialized View: Вот это уже тяжёлая артиллерия. Когда у тебя есть ебанутый отчёт, который строится минуту, а запрашивают его каждые пять секунд. И все орут, что всё тормозит. Вот тут ты материализуешь эту хуйню, обновляешь раз в час/день, и все счастливы. Главное — смириться, что данные там могут быть не самые свежие.