Vista materializada
¿Qué es una vista materializada en PostgreSQL?
Una vista materializada almacena el resultado de una consulta para que pueda leerse como una tabla. Las lecturas son rápidas, pero los datos solo cambian cuando ejecutas REFRESH MATERIALIZED VIEW.
Una vista materializada ejecuta su consulta de definición una vez y almacena el resultado, a diferencia de una vista normal, que ejecuta su consulta cada vez que se lee. Leerla es tan rápido como leer una tabla, y puede tener sus propios índices.
Los datos almacenados no siguen los cambios de las tablas subyacentes; solo cambian cuando ejecutas REFRESH MATERIALIZED VIEW. Un refresco simple bloquea las lecturas de la vista mientras se ejecuta. Con CONCURRENTLY, las lecturas pueden continuar durante el refresco, lo que requiere al menos un índice único en la vista y puede ser más rápido cuando cambian pocas filas.
Ejemplo
El ejemplo suma las ventas por zona en una vista materializada, registra una venta nueva y refresca la vista de forma concurrente, algo que permite el índice único. El total de north incluye la venta nueva solo después del refresco.
CREATE TABLE sales (id int PRIMARY KEY, region text, amount numeric);
INSERT INTO sales
SELECT g, (ARRAY['north', 'south', 'east'])[1 + g % 3], g % 50
FROM generate_series(1, 30000) AS g;
CREATE MATERIALIZED VIEW sales_by_region AS
SELECT region, sum(amount) AS total FROM sales GROUP BY region;
CREATE UNIQUE INDEX ON sales_by_region (region);
INSERT INTO sales VALUES (30001, 'north', 1000);
REFRESH MATERIALIZED VIEW CONCURRENTLY sales_by_region;
SELECT * FROM sales_by_region ORDER BY region;SQL simple para PostgreSQL 16 o 17 estándar, sin extensiones. Ejecútalo en una base de datos vacía que puedas descartar.
Fuentes
Documentación oficial de PostgreSQL (en inglés).