SunFruits Exports
POWER BI · INTERMEDIO–AVANZADO
Programa Power BI para SunFruits Exports · Módulo 2 · Día 5

Sesión 5
DirectQuery y
optimización en origen

Modos de almacenamiento, modelos compuestos y query folding

Bloque A · Conexión y modosBloque B · Optimización en origen

Inicio del Módulo 2 · fuente: base de datos relacional

Mapa de la sesión

🅰 Bloque A — 45 min

Conexión y modos de almacenamiento

  • Import vs DirectQuery vs Live
  • Storage mode por tabla
  • Dual y modelos compuestos
  • Cuándo usar cada modo

🅱 Bloque B — 45 min

Optimización en origen

  • Query folding (ver consulta nativa)
  • Empujar trabajo a vistas SQL
  • Agregaciones
  • Cardinalidad e integridad referencial

Origen: la base de datos sunfruits (vista vw_ventas).

Objetivos de aprendizaje

Al terminar la sesión vas a poder…

Elegir

El modo de almacenamiento correcto por tabla según el caso.

Componer

Modelos compuestos (Import + DirectQuery + Dual) sin penalizar.

Optimizar

Aprovechar query folding y empujar el trabajo al origen.

💡 Idea fuerza

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.

Cambio de módulo: del Excel a la BD

Módulo 1 (Excel)

  • Datos sucios, limpieza en Power Query
  • Todo en memoria (Import)

Módulo 2 (Base de datos)

  • Origen limpio y normalizado (vw_ventas)
  • Decides qué traer y qué dejar en el servidor
  • Rendimiento y volumen entran en juego

Misma estrella de SunFruits, pero ahora servida por SQL.

Bloque A · 45 min

Conexión y modos
de almacenamiento

Import · DirectQuery · Dual · Compuesto

Import vs DirectQuery vs Live

ModoDónde viven los datosPros / Contras
ImportEn memoria (VertiPaq), copia en el .pbixRapidísimo · pero hay que refrescar y cabe en memoria
DirectQueryQuedan en el origen; se consulta en vivoDatos frescos y sin límite de tamaño · depende del origen
Live connectionModelo externo (AS / dataset)Un modelo central reutilizable

En el Módulo 2 combinamos Import y DirectQuery: eso es un modelo compuesto.

Storage mode por tabla

Cada tabla del modelo puede tener su propio modo. Lo defines en la vista Modelo → Propiedades → Modo de almacenamiento.

  • Import: dimensiones pequeñas
  • DirectQuery: hecho grande
  • Dual: dimensiones compartidas
Modo de almacenamiento por tabla
Modo de almacenamiento de una tabla · Microsoft Learn

DirectQuery: consulta en vivo

Tabla DirectQuery
Tabla en DirectQuery · Microsoft Learn

Cada visual genera SQL en vivo contra el origen.

  • ✔ Datos siempre frescos
  • ✔ Sin límite de memoria
  • ✘ Latencia según el origen
  • ✘ No todo el DAX se puede plegar

Úsalo para el hecho fact_ventas (grande y cambiante).

Dual: lo mejor de ambos

Una tabla Dual actúa como Import cuando le conviene y como DirectQuery cuando se relaciona con un hecho DQ.

  • Ideal para dimensiones que filtran hechos DirectQuery
  • Evita "relaciones limitadas" lentas

SunFruits: marca dim_cliente, dim_producto como Dual.

Tabla Dual
Tabla Dual · Microsoft Learn

Modelo compuesto

Modelo compuesto
Consulta combinando Import + DirectQuery · Microsoft Learn

Un modelo puede mezclar tablas Import, DirectQuery y Dual a la vez.

  • Hecho en DQ + dimensiones Import/Dual
  • Permite agregaciones (Bloque B)
  • Cuidado con la privacidad entre orígenes

¿Cuándo uso cada modo?

Import

Volumen que cabe en memoria, refresco periódico aceptable, máximo rendimiento.

DirectQuery

Datos enormes o que cambian al instante; requisito de "tiempo real".

Compuesto/Dual

Hecho DQ + dimensiones rápidas + agregaciones para acelerar.

Regla SunFruits: fact_ventas = DirectQuery, dimensiones = Import/Dual.

Bloque B · 45 min

Optimización
en el origen

Query folding, vistas y agregaciones

Query folding: el origen hace el trabajo

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.

Pasos que pliegan vs que rompen

// 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.

Empujar lógica a vistas SQL

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.

Agregaciones para DirectQuery

El problema

Sumar millones de filas en DQ por cada visual es lento.

La solución

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.

Reducir cardinalidad

Caro

  • IDs/textos largos como clave
  • datetime con segundos
  • Decimales con muchos dígitos
  • Columnas que nadie usa

Eficiente

  • Claves enteras (surrogate)
  • Separar fecha y hora
  • Redondear lo razonable
  • Quitar columnas sin uso

Menos valores distintos = mejor compresión y consultas más rápidas.

Relaciones e integridad referencial

Nuestra BD define FOREIGN KEY en fact_ventas → integridad garantizada para activar esta opción sin perder filas.

Arquitectura recomendada (SunFruits)

Vista de modelo con relaciones
Vista Modelo · Microsoft Learn
  • fact_ventasDirectQuery
  • dim_cliente, dim_productoDual
  • dim_fundo, CalendarioImport
  • Agregado mes-producto → Import

Frescura donde importa, velocidad donde se consulta.

Buenas prácticas

En el origen

  • Vistas limpias y con índices
  • Tipos correctos y claves enteras
  • Tabla/vista agregada

En Power BI

  • Verifica folding (consulta nativa)
  • Storage mode pensado por tabla
  • Integridad referencial asumida
  • Mide el SQL generado

🛠 Taller de la sesión

Parte 1 — Conectar

  • Conecta a la BD sunfruits (vista vw_ventas) en DirectQuery.
  • Importa dimensiones; marca compartidas como Dual.

Parte 2 — Optimizar

  • Verifica folding con "Ver consulta nativa".
  • Configura la agregación con vw_ventas_agg_mes.
  • Activa integridad referencial en las relaciones.

Resumen — puntos importantes

🅰 Modos

  • Import (memoria) vs DirectQuery (en vivo) vs Dual
  • Modelo compuesto = lo mejor de ambos
  • Hecho en DQ, dimensiones Import/Dual

🅱 Optimización

  • Query folding empuja al origen
  • Lógica en vistas SQL
  • Agregaciones para hechos grandes
  • Cardinalidad e integridad referencial

🎯 Una idea: que el servidor haga el trabajo. Power BI pide lo justo y muestra rápido.

Preguntas de repaso

Verifiquemos lo aprendido en esta sesión

1

¿Cuándo elegirías DirectQuery en lugar de Import?

2

¿Para qué sirve el modo Dual en un modelo compuesto?

3

¿Qué es el query folding y cómo verificas que ocurre?

4

¿Qué problema resuelven las agregaciones en DirectQuery?

5

¿Por qué conviene "asumir integridad referencial" en relaciones DQ?

Sun Fruits Exports · Programa Power BI

¡Gracias!

Gracias al equipo de SunFruits por su tiempo y participación

Edwin Barrientos Retuerto

Arquitecto de Inteligencia de Negocios & Cloud · Instructor

🌐 blog.arquitecturabi.pe

Nos vemos en la Sesión 6 — DAX avanzado e inteligencia de tiempo

1 / 24