Rendimiento y Buenas Prácticas
Un reporte lento es un reporte que nadie usa. Optimizar el rendimiento de Power BI requiere atención al modelo de datos, las medidas DAX y el diseño del reporte.
Diagnóstico de rendimiento
Performance Analyzer
- Ve a Vista → Analizador de rendimiento → Iniciar grabación.
- Interactúa con el reporte (cambia filtros, navega entre páginas).
- Observa los tiempos de cada visualización:
Visual "Gráfico de Ventas":
DAX Query: 120ms
Visual Display: 45ms
Other: 15ms
Total: 180ms
Si una visualización toma más de 2-3 segundos, necesita optimización.
DAX Studio
Herramienta externa gratuita para analizar y optimizar consultas DAX:
- Ejecuta medidas individualmente.
- Ve el plan de ejecución.
- Analiza el uso de memoria del modelo.
- Identifica columnas con alta cardinalidad.
Optimización del modelo de datos
Reducir la cardinalidad
La cardinalidad es el número de valores únicos en una columna. A menor cardinalidad, mejor compresión y rendimiento.
ANTES: Fecha/Hora completa → 525,600 valores únicos
DESPUÉS: Solo Fecha → 1,440 valores únicos (365x menos)
ANTES: ID Transacción (GUID) → Millones de valores únicos
DESPUÉS: ID Transacción (int) → Misma cantidad pero más comprimido
Eliminar columnas innecesarias
Cada columna ocupa memoria RAM. Elimina en Power Query:
- Columnas que no usas en relaciones, filtros ni visualizaciones.
- Columnas de ID intermedias que solo sirven para transformación.
- Columnas de texto largo que no necesitas.
Tipos de datos correctos
| En vez de | Usa |
|---|---|
| Texto para números | Número entero o decimal |
| Datetime si solo necesitas fecha | Date |
| Texto para sí/no | Booleano |
| Número decimal para enteros | Número entero |
Deshabilitar auto date/time
Power BI crea automáticamente tablas de fechas ocultas por cada columna de tipo fecha. Desactívalo:
- Archivo → Opciones → Datos actuales → Autocreación date/time → Desactivar.
- Usa tu propia tabla de calendario.
Optimización de DAX
Evitar FILTER cuando puedas usar filtros directos
// ❌ Más lento: FILTER itera toda la tabla
CALCULATE([Ventas], FILTER(Productos, Productos[Categoría] = "Electrónica"))
// ✅ Más rápido: Filtro directo optimizado por el motor
CALCULATE([Ventas], Productos[Categoría] = "Electrónica")
Usar variables (VAR) para evitar recálculo
// ❌ Calcula [Ventas] tres veces
Indicador =
IF([Ventas] > 100000, "Alto",
IF([Ventas] > 50000, "Medio", "Bajo"))
// ✅ Calcula [Ventas] una sola vez
Indicador =
VAR V = [Ventas]
RETURN
IF(V > 100000, "Alto",
IF(V > 50000, "Medio", "Bajo"))
DISTINCTCOUNT vs COUNTROWS + VALUES
// Ambos dan el mismo resultado, pero DISTINCTCOUNT es más rápido
Num Clientes = DISTINCTCOUNT(Ventas[ClienteID]) // ✅
Num Clientes = COUNTROWS(VALUES(Ventas[ClienteID])) // ❌ más lento
Evitar columnas calculadas cuando puedas usar medidas
Las columnas calculadas se almacenan en memoria y aumentan el tamaño del modelo. Las medidas se calculan on-demand.
// ❌ Columna calculada innecesaria
Ganancia = Ventas[Precio] - Ventas[Costo] // Ocupa RAM por cada fila
// ✅ Medida: se calcula solo cuando se necesita
Ganancia Total = SUMX(Ventas, Ventas[Precio] - Ventas[Costo])
Optimización del reporte
Reducir el número de visualizaciones
- Máximo 8 visualizaciones por página.
- Cada visual genera una consulta al modelo.
- Más visualizaciones = más consultas = más lento.
Limitar las filas en tablas/matrices
// En vez de mostrar 10,000 filas, usa Top N
Top 20 Clientes =
CALCULATE(
[Ventas],
TOPN(20, ALL(Clientes[Nombre]), [Ventas], DESC)
)
Evitar bi-directional cross-filtering
Los filtros bidireccionales multiplican el costo computacional. Usa unidireccional siempre que sea posible.
Deshabilitar interacciones innecesarias
Si un slicer no necesita afectar una visualización específica, deshabilita la interacción:
- Selecciona el slicer → Formato → Editar interacciones → Ninguno en el visual.
Tamaño del archivo .pbix
| Acción | Impacto |
|---|---|
| Eliminar columnas innecesarias | Alto |
| Usar tipos de datos correctos | Medio |
| Reducir cardinalidad | Alto |
| Eliminar datos históricos antiguos | Alto |
| Deshabilitar auto date/time | Medio |
| Eliminar tablas no referenciadas | Bajo |
Checklist de rendimiento
- Modelo en esquema estrella.
- Columnas innecesarias eliminadas.
- Tipos de datos correctos.
- Auto date/time deshabilitado.
- Tabla de calendario dedicada.
- Medidas con VAR para evitar recálculo.
- Filtros directos en vez de FILTER cuando sea posible.
- Máximo 8 visualizaciones por página.
- Filtros bidireccionales eliminados.
- Performance Analyzer revisado.
Resumen
El rendimiento de Power BI depende de un modelo limpio (pocas columnas, baja cardinalidad, tipos correctos), DAX eficiente (VAR, filtros directos, evitar columnas calculadas innecesarias) y reportes ligeros (pocas visualizaciones, Top N en tablas). Usa Performance Analyzer y DAX Studio para diagnosticar cuellos de botella.