Создать и обновить материализованное представление
Oracle
-- FAST refresh first requires an MV log on the source table:
CREATE MATERIALIZED VIEW LOG ON sales
WITH ROWID, SEQUENCE (region, amount) INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW mv_revenue
BUILD IMMEDIATE REFRESH FAST ON COMMIT
AS SELECT region, SUM(amount) total, COUNT(*) cnt, COUNT(amount) amount_cnt
FROM sales GROUP BY region;
-- Manual refresh
EXEC DBMS_MVIEW.REFRESH('MV_REVENUE', 'C');REFRESH FAST требует журнала материализованного представления; COMPLETE ('C') пересчитывает полностью, FAST ('F') — инкрементально. ON COMMIT/ON DEMAND определяет момент обновления.
PostgreSQL
CREATE MATERIALIZED VIEW mv_revenue AS
SELECT region, SUM(amount) AS total FROM sales GROUP BY region;
-- Refresh (CONCURRENTLY requires a unique index)
CREATE UNIQUE INDEX ON mv_revenue (region);
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_revenue;REFRESH пересчитывает всё (не инкрементально). CONCURRENTLY не блокирует чтение, но требует уникального индекса и работает медленнее.
MySQL
-- MySQL/MariaDB has no built-in materialized views.
-- Approach: summary table + refresh with a trigger or a scheduled event
CREATE TABLE mv_revenue (region VARCHAR(50) PRIMARY KEY, total DECIMAL(18,2));
CREATE EVENT ev_mv_revenue ON SCHEDULE EVERY 1 HOUR DO
REPLACE INTO mv_revenue SELECT region, SUM(amount) FROM sales GROUP BY region;Встроенной поддержки материализованных представлений нет. Поддерживается сводная таблица, которая заполняется либо мгновенно триггерами, либо периодически через EVENT SCHEDULER.
SQL Server
-- Indexed view (materialized view equivalent)
CREATE VIEW dbo.mv_revenue WITH SCHEMABINDING AS
SELECT region, SUM(ISNULL(amount, 0)) AS total, COUNT_BIG(*) AS cnt
FROM dbo.sales GROUP BY region;
GO
CREATE UNIQUE CLUSTERED INDEX ix_mv_revenue ON dbo.mv_revenue (region);SQL Server использует индексированные представления: WITH SCHEMABINDING обязателен; после создания уникального кластерного индекса данные физически хранятся и поддерживаются автоматически (отдельный REFRESH не нужен). С GROUP BY обязателен COUNT_BIG(*); если столбец внутри SUM допускает NULL, пишите SUM(ISNULL(amount, 0)) (иначе ошибка 8662). Представление должно создаваться с QUOTED_IDENTIFIER и ANSI_NULLS ON. Автоматическое сопоставление представлений оптимизатором запросов доступно только в редакции Enterprise (и Developer); в Standard обращайтесь к представлению с хинтом WITH (NOEXPAND).
MongoDB
// On-demand materialized view: write the result to a collection with $merge
db.sales.aggregate([
{ $group: { _id: "$region", total: { $sum: "$amount" } } },
{ $merge: { into: "mv_revenue", whenMatched: "replace", whenNotMatched: "insert" } }
]);Материализованное представление по требованию получают, записывая результат агрегации в постоянную коллекцию через $out или $merge. Для обновления перезапустите конвейер (вручную или планировщиком).
Redis
# Not applicable: Redis has no materialized views. The computed result is written to a key
# and cached with a TTL.
SET mv:revenue:region1 12345 EX 3600Понятия материализованного представления нет; ближайший подход — хранить предвычисленные значения в ключах (String/Hash/Sorted Set) и кэшировать их на ограниченное время через EX/TTL.
Elasticsearch
# Continuous/materialized summary index with a transform
PUT _transform/mv_revenue
{ "source": { "index": "sales" },
"dest": { "index": "mv_revenue" },
"pivot": { "group_by": { "region": { "terms": { "field": "region" } } },
"aggregations": { "total": { "sum": { "field": "amount" } } } } }
POST _transform/mv_revenue/_startTransform поворачивает (pivot) исходный индекс и материализует его в сводный целевой индекс. Этот пример — пакетный transform: он выполняется один раз через _start и останавливается. Для непрерывного transform, который автоматически обновляется при поступлении новых данных, добавьте в конфигурацию "sync": { "time": { "field": "<time_field>", "delay": "60s" } } с полем времени (настройки continuous: true не существует).