Преподаватель переключает на Слайды 7–11. На доске формируется сравнительная матрица двух типов представлений.
Прямая речь преподавателя:
«Переходим к кульминационной теме занятия — архитектуре представлений.
1. Обычное динамическое представление (VIEW). Это виртуальная таблица. Сколько байт на диске занимает сам VIEW? Ровно 0 байт! В системном каталоге хранится только текст вашего запроса
SELECT. Когда пользователь пишет
SELECT * FROM v_clients, оптимизатор СУБД на лету соединяет дерево этого представления с запросом пользователя. Зачем нужен VIEW? Во-первых, для безопасности и сокрытия персональных данных (Security through Views): мы можем скрыть столбец с паролями, номерами паспортов или замаскировать фамилии пациентов. Во-вторых, чтобы скрыть от программистов бэкенда ужас из 8 соединений таблиц, предоставив им одну красивую виртуальную таблицу.
2. Материализованное представление (MATERIALIZED VIEW). Здесь логика иная. Результат SQL-запроса один раз вычисляется и физически записывается на жесткий диск или SSD в блоки данных СУБД. Витрина занимает реальное место на диске. Главное преимущество: аналитический запрос по 10 миллионам строк читается моментально, за доли миллисекунды, как из обычной таблицы! Более того, по столбцам материализованного представления мы имеем полное право построить любые индексы: B-Tree, GIN, Hash.
Но как поддерживать данные в актуальном состоянии? С помощью команды
REFRESH MATERIALIZED VIEW. При обычном обновлении накладывается эксклюзивный замок, и на время пересчета никто не может читать витрину. Поэтому в высоконагруженных системах используют опцию
REFRESH MATERIALIZED VIEW CONCURRENTLY. В этом режиме клиенты спокойно читают старый снимок, пока СУБД в фоне готовит обновления.
Запомните правило: чтобы работал
CONCURRENTLY, на материализованном представлении
обязан существовать хотя бы один UNIQUE INDEX, иначе СУБД выдаст ошибку!».