EMZETT.
Войти

Представления SQL: сохранённые запросы как виртуальные таблицы

Коротко: Представление (view) — именованный сохранённый запрос, который можно использовать как таблицу; он упрощает сложные запросы и может ограничивать доступ к столбцам.

Подробнее: Вместо того чтобы снова и снова писать длинный запрос с несколькими соединениями, вы сохраняете его один раз как представление (CREATE VIEW). Затем запрашиваете SELECT * FROM view_name. Представление обычно не хранит собственных данных, а выполняет запрос при каждом вызове.

Подробности

Польза

  • Упрощение: сложные соединения и вычисления в одном месте.
  • Контроль доступа: пользователи видят только избранные столбцы/строки (например, без столбца зарплаты); права выдаются на представление.
  • Стабильный интерфейс: структура таблиц может меняться, а представление сохраняет результат прежним для приложений.
  • Читаемость отчётов.

Материализованные представления

Материализованное представление (CREATE MATERIALIZED VIEW) хранит результат физически. Запросы становятся быстрыми, но данные актуальны лишь настолько, насколько последний REFRESH MATERIALIZED VIEW. Подходит для дорогих аналитических запросов (статистика, панели), которым не нужна точность до секунды. В PostgreSQL можно обновлять с CONCURRENTLY без блокировки читателей (нужен уникальный индекс).

Пределы

  • Обычные представления не быстрее исходного запроса; планировщик разворачивает их в запрос.
  • Запись через представления работает только для простых представлений (одна таблица, без агрегации) или с триггерами INSTEAD OF.
  • Вложенные представления быстро становятся запутанными и медленными.
  • Изменения базовых таблиц могут сделать представления недействительными; документируйте зависимости.

Взгляд экзамена

Представление = виртуальная таблица во внешней схеме трёхсхемной архитектуры. Польза: независимость данных и защита данных. Противоположность: материализованное представление как кэшированный результат.

См. также: Соединения (join), Планировщик запросов и EXPLAIN, Подзапросы и CTE