Modelado para Power BI: optimizar el modelo semántico con VertiPaq
João Barros
06 de January de 2026
2 min de lectura
El motor VertiPaq de Power BI (y Analysis Services) tiene características de almacenamiento y ejecución diferentes de un RDBMS tradicional. Modelar específicamente para VertiPaq puede mejorar el rendimiento de las consultas en 10x o más.
Cómo almacena los datos VertiPaq
VertiPaq = columnar + compresión por diccionario
- Cada columna almacenada por separado
- Diccionario: valores únicos → IDs enteros compactos
- Run-length encoding para valores repetidos consecutivos
- Impacto: las columnas con POCOS valores únicos comprimen mejor
- 1 columna TEXT "Pais" con 50 valores únicos ≈ 3-4 bytes/fila
- 1 columna TEXT "Descripcion" con 1M valores únicos ≈ 50+ bytes/fila
Reglas de oro para VertiPaq
1. ELIMINAR columnas no usadas en visuales o relaciones
→ Cada columna ocupa memoria INCLUSO sin relaciones
2. EVITAR columnas de alta cardinalidad innecesarias
→ Campos como "comentario libre" o "ID secuencial con prefijo"
→ Prefiera enteros (ID INT) a strings ('PROD-001234')
3. NUNCA usar RELATED() en columnas calculadas en tablas de hechos
→ Materializa la columna en cada fila — explota el modelo
4. USAR medidas en lugar de columnas calculadas para agregaciones
→ Las medidas se calculan en query time; las columnas calculadas ocupan memoria
5. FECHAS como tipo Date (no DateTime) cuando no necesita la hora
→ DateTime tiene una cardinalidad mucho mayor
Diagnóstico con DAX Studio
-- Ver el tamaño de cada columna del modelo
EVALUATE
SELECTCOLUMNS(
FILTER(
INFO.STORAGETABLECOLUMNS(),
[DICTIONARY_SIZE_KB] > 100
),
"Tabla", [DIMENSION_NAME],
"Columna", [ATTRIBUTE_NAME],
"Dict KB", [DICTIONARY_SIZE_KB],
"Data KB", [USED_SIZE_KB],
"Cardinalidad", [SEGMENT_COUNT]
)
ORDER BY [DICTIONARY_SIZE_KB] DESC
Relaciones y filtrado
-- Reglas para las relaciones Power BI:
✓ Siempre que sea posible: relación 1:N (dimensión → hechos)
✗ Evitar: many-to-many directas
✗ Evitar: filtrado bidireccional (Both)
→ Causa consultas ambiguas y loops de filtrado
→ Use la función DAX CROSSFILTER() solo cuando sea absolutamente necesario
Conclusión
Optimizar para VertiPaq no es sobre SQL — es sobre cardinalidad, número de columnas y diseño de medidas. Un modelo bien optimizado cabe en 10x menos memoria, carga en la mitad del tiempo y responde a las consultas 5-10x más rápido. Invierta 30 minutos en DAX Studio tras cada refresh de modelo.