[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-chto-takoe-predstavleniya-views-i-materializovannye-predstavleniya":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1047,"chto-takoe-predstavleniya-views-i-materializovannye-predstavleniya",28,"postgresql","PostgreSQL","🐘","Что такое представления (views) и материализованные представления?","Представление (view) — именованный сохранённый запрос, выполняемый каждый раз при обращении. Материализованное представление (materialized view) — представление, результат которого физически сохраняется на диск. Выбор между ними — компромисс между актуальностью данных и скоростью чтения.\n\n### Обычное представление (VIEW)\n\n```sql\nCREATE VIEW active_clients AS\nSELECT c.id, c.name, c.email, a.balance\nFROM clients c\nJOIN accounts a ON a.client_id = c.id\nWHERE c.status = 'active' AND a.balance > 0;\n\n-- Использование как обычной таблицы\nSELECT * FROM active_clients WHERE balance > 100000;\n```\n\nПростые представления (одна таблица, без агрегаций) могут быть обновляемыми — допускают INSERT\u002FUPDATE\u002FDELETE.\n\n### Материализованное представление (MATERIALIZED VIEW)\n\n\u003Cdetails>\u003Csummary>Пример создания и использования\u003C\u002Fsummary>\n\n```sql\nCREATE MATERIALIZED VIEW mv_monthly_stats AS\nSELECT\n    date_trunc('month', created_at) AS month,\n    account_id,\n    count(*) AS tx_count,\n    sum(amount) AS total_amount,\n    avg(amount) AS avg_amount\nFROM transactions\nGROUP BY date_trunc('month', created_at), account_id;\n\n-- Создание индекса на материализованном представлении\nCREATE UNIQUE INDEX idx_mv_stats ON mv_monthly_stats (month, account_id);\n\n-- Запрос — быстро, читаем из предвычисленных данных\nSELECT * FROM mv_monthly_stats WHERE account_id = 100;\n\n-- Обновление данных (полная перестройка)\nREFRESH MATERIALIZED VIEW mv_monthly_stats;\n\n-- Обновление без блокировки чтения (требует UNIQUE INDEX)\nREFRESH MATERIALIZED VIEW CONCURRENTLY mv_monthly_stats;\n```\n\n\u003C\u002Fdetails>\n\n### Сравнение\n\n| Свойство | VIEW | MATERIALIZED VIEW |\n|---|---|---|\n| Хранение данных | Нет (запрос каждый раз) | Да (физически на диске) |\n| Актуальность | Всегда актуальные | Данные на момент REFRESH |\n| Скорость чтения | Зависит от сложности запроса | Быстро |\n| Индексы | Нет (используются индексы базовых таблиц) | Можно создавать свои |\n| INSERT\u002FUPDATE\u002FDELETE | Возможно (для простых) | Нет |\n\n### Когда использовать materialized view\n\n- Тяжёлые аналитические запросы (отчёты, дашборды)\n- Данные обновляются редко или допустима небольшая задержка\n- Запрос читается часто, а базовые данные меняются нечасто\n\n> **На собеседовании:** `REFRESH MATERIALIZED VIEW CONCURRENTLY` — это ключевое слово, которое показывает знание production-практик: без CONCURRENTLY обновление блокирует чтение. Для CONCURRENTLY обязателен UNIQUE INDEX на materialized view.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое представления (views) и материализованные представ — Gymterview","Представление (view) — именованный сохранённый запрос, выполняемый каждый раз при обращении. Материализованное представление (materialized view) — представление","Представление (view) — именованный сохранённый запрос, выполняемый каждый раз при обращении. Материализованное представл",[7,13],"Представление (view) — именованный сохранённый запрос, выполняемый каждый раз при обращении. Материализованное представление (materialized view) — представление, результат которого физически сохраняется на диск. Выбор между ними — компромисс между актуальностью данных и скоростью чтения.",true]