Cómo crear vistas materializadas en Lakehouse: paso a paso
Este tutorial muestra cómo crear vistas materializadas en Lakehouse para acelerar consultas analíticas frecuentes. Las materialized views reducen I/O y mejoran el rendimiento al preagregar o prefiltrar datos, útil para informes y dashboards en Power BI o análisis ad-hoc.
Requisitos previos
- Instancia Lakehouse con tablas Delta accesibles (por ejemplo en Microsoft Fabric).
- Permisos para crear objetos SQL y programar jobs.
- Herramienta SQL para ejecutar comandos (SQL endpoint, Synapse o interfaz del Fabric).
Paso 1: Elegir el caso de uso y la consulta base
Decida qué consulta es costosa y se beneficia de la materialización: agregación por día, top N, o unión pesada. La consulta base debe ser determinista y relativamente estable. Ejemplo: agregación diaria de ventas por producto.
-- Consulta base: total de ventas por product_id por día
SELECT
product_id,
CAST(sale_date AS DATE) AS sale_day,
SUM(amount) AS total_sales,
COUNT(*) AS sales_count
FROM sales_delta
GROUP BY product_id, CAST(sale_date AS DATE);
Paso 2: Crear una tabla Delta para almacenar la materialización
Una materialized view en muchos entornos Lakehouse se implementa como una tabla precomputada (Delta). Cree una tabla Delta para guardar el resultado y elija la partición adecuada (por ejemplo sale_day) para consultas eficientes.
CREATE TABLE IF NOT EXISTS mv_sales_by_day
USING DELTA
PARTITIONED BY (sale_day)
AS
SELECT
product_id,
CAST(sale_date AS DATE) AS sale_day,
SUM(amount) AS total_sales,
COUNT(*) AS sales_count
FROM sales_delta
GROUP BY product_id, CAST(sale_date AS DATE);
Paso 3: Implementar refresh inicial e incremental (ETL/ELT)
El refresh puede ser completo (truncate+insert) o incremental. Para rendimiento, haga incremental usando una columna updated_at o una tabla de CDC. Aquí mostramos un ejemplo simple basado en updated_at: actualizamos los días modificados desde la última ejecución.
-- Ejemplo: identificar días modificados
WITH changed_days AS (
SELECT DISTINCT CAST(sale_date AS DATE) AS sale_day
FROM sales_delta
WHERE updated_at >= DATEADD(day, -1, current_timestamp()) -- último día
)
-- Recalcular solo los días modificados
MERGE INTO mv_sales_by_day AS target
USING (
SELECT
product_id,
sale_day,
SUM(amount) AS total_sales,
COUNT(*) AS sales_count
FROM sales_delta
WHERE CAST(sale_date AS DATE) IN (SELECT sale_day FROM changed_days)
GROUP BY product_id, CAST(sale_date AS DATE)
) AS src
ON target.product_id = src.product_id AND target.sale_day = src.sale_day
WHEN MATCHED THEN
UPDATE SET total_sales = src.total_sales, sales_count = src.sales_count
WHEN NOT MATCHED
THEN INSERT (product_id, sale_day, total_sales, sales_count) VALUES (src.product_id, src.sale_day, src.total_sales, src.sales_count);
Paso 4: Programar refresh y gestionar fallos
Automatice el refresh con un job scheduler (p. ej.: Azure Data Factory, Synapse pipelines, o el scheduler del Fabric). Configure alertas para fallos y retención de logs para auditoría. Defina la frecuencia según el SLA: cada minuto, cada hora o diario.
-- Pseudocódigo del job: ejecutar script de MERGE anterior
-- En el scheduler, crear pipeline que ejecute query SQL en el endpoint del Lakehouse
-- Definir política de retry y notificación en caso de error
Paso 5: Optimizaciones y mantenimiento
Monitorice el tamaño y la fragmentación de la tabla Delta materializada. Ejecute OPTIMIZE y ZORDER si están disponibles para reducir archivos pequeños y acelerar filtros por columnas frecuentes. Reevalúe particiones y, si es necesario, haga un refresh completo periódicamente.
-- Ejemplos comunes de mantenimiento
OPTIMIZE mv_sales_by_day ZORDER BY (product_id);
-- Si existe soporte, usar VACUUM con cuidado para eliminar archivos antiguos
VACUUM mv_sales_by_day RETAIN 168 HOURS; -- no eliminar historial reciente
Verificar el resultado
Confirme que la tabla materializada acelera consultas comparando tiempos antes/después. Pruebe una query típica y verifique que los datos coinciden con la fuente y que el job de refresh actualiza los cambios.
-- Prueba de rendimiento y validez
EXPLAIN SELECT product_id, total_sales FROM mv_sales_by_day WHERE sale_day = '2026-10-01' ORDER BY total_sales DESC LIMIT 10;
-- Comparación simple de conteos
SELECT SUM(total_sales) FROM mv_sales_by_day WHERE sale_day = '2026-10-01';
SELECT SUM(amount) FROM sales_delta WHERE CAST(sale_date AS DATE) = '2026-10-01';
Conclusión
Crear materialized views en Lakehouse con una tabla Delta permite acelerar consultas y reducir costes de I/O. Próximos pasos: integrar con Power BI, implementar refresh basado en CDC para menor latencia y automatizar alertas. Consejo: empiece con agregaciones simples y monitorice el coste/beneficio antes de materializarlo todo.