(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Modelação de Dados (Kimball)
Modelação de Dados (Kimball) 2 min

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.

Partilhar: