(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo crear vistas materializadas en Lakehouse: paso a paso

João Barros 17 de October de 2026 4 min de lectura

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.