Ответ
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: Вот это уже тяжёлая артиллерия. Когда у тебя есть ебанутый отчёт, который строится минуту, а запрашивают его каждые пять секунд. И все орут, что всё тормозит. Вот тут ты материализуешь эту хуйню, обновляешь раз в час/день, и все счастливы. Главное — смириться, что данные там могут быть не самые свежие.