Optimización de Rendimiento

Técnicas para modelos Power BI más rápidos: el 80% de los problemas de rendimiento tienen su origen en el modelo, no en el DAX

Avanzado
🔧

Motor VertiPaq: Entender Cómo Funciona

El motor detrás de Power BI

VertiPaq es el motor de almacenamiento columnar en memoria de Power BI (compartido con Analysis Services y Power Pivot). Almacena los datos por columnas y los comprime usando dos técnicas principales:

Codificación por valor (Value Encoding):

Para columnas numéricas con valores predecibles. Muy eficiente — puede comprimir 100:1 en columnas de pocos valores distintos.

Codificación por hash (Hash Encoding):

Para columnas con alta variedad de valores (texto, fechas precisas, IDs únicos). Menos eficiente — difícil de comprimir.

Implicación práctica:

Las columnas con pocos valores únicos (cardinalidad baja) se comprimen muy bien. Las columnas con muchos valores únicos (alta cardinalidad) se comprimen mal y consumen mucha RAM. Tu objetivo como diseñador de modelos es maximizar las primeras y minimizar las segundas.

🔢

Reducir la Cardinalidad

Estrategias para reducir valores únicos

1. Truncar la precisión temporal

// MAL: FechaHora tiene millones de valores únicos
FactEventos[FechaHora] = "2024-03-15 14:32:47.123"  // Alta cardinalidad

// BIEN: Separar fecha y hora si la precisión no es necesaria
// En Power Query:
Fecha = Date.From([FechaHora])       // Solo la parte de fecha
Hora = Time.Hour([FechaHora])        // Solo la hora (0-23)
// Mejor aún: eliminar la columna original si no necesitas la hora

2. Redondear valores numéricos

// MAL: Precio con 4 decimales → alta cardinalidad
Precio = 29.9999

// BIEN: Redondear a 2 decimales → menor cardinalidad
// En Power Query:
Precio = Number.Round([Precio], 2)

3. Sustituir texto repetido por enteros

// MAL: clave de producto como texto en tabla de hechos
FactVentas[CodigoProducto] = "PROD-ESP-CAT-00507"  // 22 caracteres

// BIEN: usar IDProducto como entero para la relación
FactVentas[IDProducto] = 507  // 4 bytes vs 22 caracteres

4. Agrupar valores raros

// MAL: columna País con 180 valores distintos cuando el 95% es España/Francia/Alemania
// BIEN: agrupar los demás en "Otros"
Pais Agrupado =
IF(
    DimCliente[Pais] IN {"España", "Francia", "Alemania", "Italia", "Portugal"},
    DimCliente[Pais],
    "Otros"
)
🗑️

Eliminar Columnas Innecesarias

Cada columna que no usas es un coste sin beneficio

Una de las mejoras de rendimiento más rápidas y efectivas: eliminar en Power Query todas las columnas que no usas en ningún lugar del modelo o informes. Cada columna ocupa RAM, ralentiza la actualización y aumenta el tamaño del PBIX.

Columnas candidatas para eliminar:

  • Columnas técnicas del sistema (ID internos, timestamps de sistema, etc.)
  • Columnas para auditoría que no van al informe (CreatedBy, ModifiedDate, etc.)
  • Columnas que ya están en otras tablas relacionadas (desnormalización innecesaria)
  • Columnas de alta cardinalidad que no son claves de relación ni se usan en visuales
  • Columnas de texto libre largo (comentarios, notas, descripciones extensas)
📌 Buena práctica: En Power Query, añade un paso "Quitar otras columnas" al final del proceso de transformación con solo las columnas que necesitas. Así si el origen añade nuevas columnas, no se cargan automáticamente. Es una práctica defensiva que evita sorpresas.
🔄

Import vs DirectQuery

La decisión arquitectural más importante

Modo Import (recomendado por defecto):

  • Los datos se cargan y almacenan en el modelo VertiPaq
  • Consultas muy rápidas — todo está en memoria
  • DAX completo disponible (todas las funciones)
  • Actualización programada (hasta 48 veces/día en Premium)
  • Límite de tamaño de dataset (1 GB en Pro, mayor en Premium)

Modo DirectQuery:

  • Los datos permanecen en la fuente — Power BI genera SQL en tiempo real
  • Sin límite de tamaño — ideal para Big Data
  • Datos siempre actualizados (latencia mínima)
  • DAX limitado — no todas las funciones disponibles
  • Rendimiento dependiente de la fuente (SQL Server, Synapse, etc.)
  • Sin columnas calculadas en tablas DirectQuery

¿Cuándo elegir cada uno?

// Import si:
//   - Dataset < 1 GB (Pro) o acepta el volumen Premium
//   - Datos no necesitan ser en tiempo real (actualización programada es suficiente)
//   - Necesitas funciones DAX complejas (inteligencia de tiempo, etc.)
//   - Quieres el mejor rendimiento de consulta posible

// DirectQuery si:
//   - Dataset demasiado grande para Import
//   - Datos en tiempo real son críticos (trading, monitorización)
//   - La fuente ya está optimizada (ej: Synapse Analytics)
//   - Requisitos de gobernanza impiden copiar datos
🔬

Herramientas de Diagnóstico

Performance Analyzer (incluido en Power BI Desktop)

La herramienta de diagnóstico integrada que muestra cuánto tarda cada visual en renderizarse. Acceso: Vista → Performance Analyzer → Iniciar grabación → Actualizar visuals.

  • DAX Query: tiempo de evaluación de la medida DAX
  • Visual display: tiempo de renderizado del visual
  • Other: otras operaciones (red, etc.)

Si "DAX Query" es el mayor componente, optimiza tus medidas. Si es "Visual display", tienes demasiados elementos visuales.

DAX Studio (gratuito, externo)

Herramienta externa imprescindible para perfilar y optimizar DAX. Permite ver el plan de ejecución, el tiempo de motor de storage vs motor de fórmulas, y capturar trazas detalladas.

VertiPaq Analyzer (integrado en DAX Studio)

Muestra el tamaño de cada tabla y columna, la cardinalidad, la ratio de compresión y el tamaño en memoria. Indispensable para identificar qué columnas están consumiendo más recursos.

💡 Tip kawaii: El primer análisis que hago siempre en un modelo lento es VertiPaq Analyzer. Ordena las columnas por "Size (bytes)" descendente — casi siempre la culpable del 80% del problema está en las primeras 5 columnas. Elimínalas o redúcelas y el modelo vuela. 🌸

Checklist de Optimización

Antes de publicar tu modelo, verifica:

  • Esquema estrella implementado — sin tablas de hechos con dimensiones anidadas
  • Eliminadas todas las columnas que no se usan en visuals, relaciones o DAX
  • Fechas de tipo Date (no DateTime) en columnas de fecha
  • Claves de relación son enteros, no texto
  • Sin columnas calculadas que podrían ser medidas
  • Sin relaciones bidireccionales innecesarias
  • Tabla de fechas marcada correctamente como tabla de fechas
  • Sin columnas de alta cardinalidad sin justificación (emails, IDs únicos no usados como claves)
  • Columnas con muchos valores nulos revisadas — ¿son necesarias?
  • Performance Analyzer ejecutado — ningún visual tarda más de 3 segundos
🚀 ¡Modelo optimizado! Para llevar el rendimiento al siguiente nivel con datasets masivos, el siguiente tema es Agregaciones: tablas de resumen precalculadas que aceleran dramáticamente las consultas en modelos DirectQuery. También puedes explorar los Modelos Compuestos para combinar Import y DirectQuery estratégicamente.