CREATE VIEW

Тема дорожной карты · PostgreSQL

CREATE VIEW определяет именованный многократно используемый запрос SELECT, сохранённый в каталоге PostgreSQL и ведущий себя как виртуальная таблица: он упрощает сложную логику запросов и обеспечивает стабильный интерфейс над лежащими в основе таблицами реляционной базы данных, которые могут со временем меняться. Представление, созданное командой CREATE VIEW active_users AS SELECT * FROM users WHERE deleted_at IS NULL, можно запрашивать точно так же, как обычную таблицу, а планировщик PostgreSQL встраивает определение представления в вызывающий запрос для оптимизации — индексы на базовых таблицах по-прежнему используются прозрачно. Вариант CREATE OR REPLACE VIEW обновляет существующее представление без его удаления, сохраняя зависимые права доступа, тогда как CREATE MATERIALIZED VIEW сохраняет результаты запроса на диск для сценариев, где пересчёт представления при каждом обращении был бы слишком дорогостоящим. Представления также служат уровнем безопасности: предоставляя SELECT на представление и отзывая прямой доступ к таблице, администраторы PostgreSQL могут открывать только те столбцы и строки, которые соответствуют правам конкретной роли в реляционной базе данных.

Как это работает

CREATE VIEW соединяет данные между таблицами: INNER, LEFT/RIGHT/FULL OUTER, CROSS, LATERAL (per-row подзапрос), SELF (alias той же таблицы). View — сохранённые запросы (CREATE VIEW v AS SELECT ...); материализованные view (CREATE MATERIALIZED VIEW ...) кешируют результат на диск, требуют REFRESH. Оконные функции (OVER (PARTITION BY ... ORDER BY ...)) считают per-row агрегацию без коллапса строк. CTE (WITH ... AS) именуют подзапросы для читаемости.

Когда применять

View — для энкапсуляции сложных запросов, переиспользуемых вызывающими: версионированная API-поверхность над схемой. Материализованные view — когда подлежащий запрос дорогой, staleness секунд-часов допустим. LATERAL — когда подзапросу нужны колонки внешнего (top-N per group — канонический пример). Оконные функции вместо сложных self-join — для running totals, рангов, перцентилей.

Типичные ошибки

Ловушки CREATE VIEW: глубоко вложенные view (SELECT из view, join-ящего три view — планировщик видит один большой запрос, может выбрать плохой план); никогда не рефрешат materialized view (stale данные неделями); FULL OUTER JOIN, где надо INNER (NULL-потоп); cartesian-взрыв от пропущенного JOIN-условия (5 таблиц × 5 unrelated строк = миллионы). Всегда EXPLAIN для join перед деплоем.

Связанные понятия

Полезные ресурсы