Modelação para Power BI: optimizar o modelo semântico com VertiPaq
João Barros
06 de January de 2026
2 min de leitura
O motor VertiPaq do Power BI (e Analysis Services) tem características de armazenamento e execução diferentes de um RDBMS tradicional. Modelar especificamente para VertiPaq pode melhorar a performance de queries em 10x ou mais.
Como o VertiPaq armazena dados
VertiPaq = colunar + compressão por dicionário
- Cada coluna armazenada separadamente
- Dicionário: valores únicos → IDs inteiros compactos
- Run-length encoding para valores repetidos consecutivos
- Impacto: colunas com POUCOS valores únicos comprimem melhor
- 1 coluna TEXT "Pais" com 50 valores únicos ≈ 3-4 bytes/linha
- 1 coluna TEXT "Descricao" com 1M valores únicos ≈ 50+ bytes/linha
Regras de ouro para VertiPaq
1. REMOVER colunas não usadas em visuais ou relações
→ Cada coluna ocupa memória MESMO sem relações
2. EVITAR colunas de alta cardinalidade desnecessárias
→ Campos como "Comentário livre" ou "ID sequencial com prefix"
→ Prefira inteiros (ID INT) a strings ('PROD-001234')
3. NUNCA usar RELATED() em colunas calculadas em tabelas de factos
→ Materializa a coluna em cada linha — explodem o modelo
4. USAR medidas em vez de colunas calculadas para agregações
→ Medidas calculam em query time; colunas calculadas ocupam memória
5. DATAS como tipo Date (não DateTime) quando não precisa de hora
→ DateTime tem muito maior cardinalidade
Diagnóstico com DAX Studio
-- Ver tamanho de cada coluna do modelo
EVALUATE
SELECTCOLUMNS(
FILTER(
INFO.STORAGETABLECOLUMNS(),
[DICTIONARY_SIZE_KB] > 100
),
"Tabela", [DIMENSION_NAME],
"Coluna", [ATTRIBUTE_NAME],
"Dict KB", [DICTIONARY_SIZE_KB],
"Data KB", [USED_SIZE_KB],
"Cardinalidade",[SEGMENT_COUNT]
)
ORDER BY [DICTIONARY_SIZE_KB] DESC
Relações e filtragem
-- Regras para relações Power BI:
✓ Sempre que possível: relação 1:N (dimensão → factos)
✗ Evitar: Many-to-many directas
✗ Evitar: filtragem bidirecional (Both)
→ Causa queries ambíguas e loops de filtragem
→ Use funções DAX CROSSFILTER() quando absolutamente necessário
Conclusão
Optimizar para VertiPaq não é sobre SQL — é sobre cardinalidade, número de colunas e design de medidas. Um modelo bem optimizado cabe em memória 10x menor, carrega em metade do tempo e responde a queries 5-10x mais rápido. Invista 30 minutos em DAX Studio após cada refresh de modelo.