
Modos de almacenamiento, modelos compuestos y query folding
Inicio del Módulo 2 · fuente: base de datos relacional
Conexión y modos de almacenamiento
Optimización en origen
Origen: la base de datos sunfruits (vista vw_ventas).
Al terminar la sesión vas a poder…
El modo de almacenamiento correcto por tabla según el caso.
Modelos compuestos (Import + DirectQuery + Dual) sin penalizar.
Aprovechar query folding y empujar el trabajo al origen.
Con una base de datos detrás, el objetivo es que el origen haga el trabajo pesado. Power BI debe pedir lo justo, no traerse todo.
vw_ventas)Misma estrella de SunFruits, pero ahora servida por SQL.
Import · DirectQuery · Dual · Compuesto
| Modo | Dónde viven los datos | Pros / Contras |
|---|---|---|
| Import | En memoria (VertiPaq), copia en el .pbix | Rapidísimo · pero hay que refrescar y cabe en memoria |
| DirectQuery | Quedan en el origen; se consulta en vivo | Datos frescos y sin límite de tamaño · depende del origen |
| Live connection | Modelo externo (AS / dataset) | Un modelo central reutilizable |
En el Módulo 2 combinamos Import y DirectQuery: eso es un modelo compuesto.
Cada tabla del modelo puede tener su propio modo. Lo defines en la vista Modelo → Propiedades → Modo de almacenamiento.


Cada visual genera SQL en vivo contra el origen.
Úsalo para el hecho fact_ventas (grande y cambiante).
Una tabla Dual actúa como Import cuando le conviene y como DirectQuery cuando se relaciona con un hecho DQ.
SunFruits: marca dim_cliente, dim_producto como Dual.


Un modelo puede mezclar tablas Import, DirectQuery y Dual a la vez.
Volumen que cabe en memoria, refresco periódico aceptable, máximo rendimiento.
Datos enormes o que cambian al instante; requisito de "tiempo real".
Hecho DQ + dimensiones rápidas + agregaciones para acelerar.
Regla SunFruits: fact_ventas = DirectQuery, dimensiones = Import/Dual.
Query folding, vistas y agregaciones
Power Query traduce tus pasos a SQL y los empuja al servidor. Menos datos viajan, todo va más rápido.
Meta: que filtros, selección de columnas y agrupaciones se plieguen al origen.
// PLIEGAN (se traducen a SQL):
= Table.SelectRows(Origen, each [fecha_pedido] >= #date(2024,1,1))
= Table.SelectColumns(Origen, {"n_orden", "monto_usd"})
= Table.Group(Origen, {"producto_id"}, {{"m", each List.Sum([monto_usd])}})
// ROMPEN el folding (déjalos al final o evítalos):
= Table.AddColumn(Origen, "x", each Text.Reverse([cliente]))
= Table.Buffer(Origen)
Filtra y reduce columnas primero; lo no plegable, al final.
En vez de transformar en M, expón vistas limpias en el origen. SunFruits ya trae vw_ventas.
CREATE VIEW sunfruits.vw_ventas AS
SELECT v.n_orden, v.fecha_pedido, c.region, c.pais,
p.producto, p.categoria, v.cajas, v.kg_netos,
v.monto_usd, to_char(v.fecha_pedido,'YYYY-MM') AS periodo
FROM fact_ventas v
JOIN dim_cliente c ON c.cliente_id = v.cliente_id
JOIN dim_producto p ON p.producto_id = v.producto_id;
La vista se pliega y centraliza la lógica de negocio en la BD.
Sumar millones de filas en DQ por cada visual es lento.
Una tabla agregada (Import) por mes-producto responde al instante; el detalle DQ solo se toca si hace falta.
-- Vista agregada que ya trae la BD de SunFruits
SELECT periodo, producto_id, SUM(monto_usd), SUM(kg_netos)
FROM vw_ventas_agg_mes; -- ~419 filas vs 4000+ del detalle
Configúrala en Administrar agregaciones mapeando al detalle DQ.
datetime con segundosMenos valores distintos = mejor compresión y consultas más rápidas.
INNER JOIN (más rápido) en vez de OUTER.Nuestra BD define FOREIGN KEY en fact_ventas → integridad garantizada para activar esta opción sin perder filas.

fact_ventas → DirectQuerydim_cliente, dim_producto → Dualdim_fundo, Calendario → ImportFrescura donde importa, velocidad donde se consulta.
sunfruits (vista vw_ventas) en DirectQuery.vw_ventas_agg_mes.🎯 Una idea: que el servidor haga el trabajo. Power BI pide lo justo y muestra rápido.
Verifiquemos lo aprendido en esta sesión
¿Cuándo elegirías DirectQuery en lugar de Import?
¿Para qué sirve el modo Dual en un modelo compuesto?
¿Qué es el query folding y cómo verificas que ocurre?
¿Qué problema resuelven las agregaciones en DirectQuery?
¿Por qué conviene "asumir integridad referencial" en relaciones DQ?
Gracias al equipo de SunFruits por su tiempo y participación
Arquitecto de Inteligencia de Negocios & Cloud · Instructor
🌐 blog.arquitecturabi.pe
Nos vemos en la Sesión 6 — DAX avanzado e inteligencia de tiempo