Consultar uma tabela Delta massiva (mais de 500 milhões de linhas) em um lakehouse do Fabric com desempenho ideal e acesso a dados quase em tempo real.
→Usar um modelo semântico no modo Direct Lake.
Por quê: O Direct Lake lê arquivos Parquet diretamente do OneLake, ignorando a importação de dados ou a tradução de consultas. Ele oferece desempenho semelhante ao modo de importação, sem duplicação de dados ou latência de atualização. O DirectQuery é mais lento; o modo Import introduz latência.
Aplicar cálculos comuns de inteligência de tempo (YTD, QTD, MTD) a dezenas de medidas base (Vendas, Lucro, Quantidade) sem criar centenas de medidas DAX.
→Implementar um grupo de cálculo com itens de cálculo para YTD, QTD e MTD.
Por quê: Grupos de cálculo eliminam a proliferação de medidas. Eles definem um conjunto de cálculos genéricos que podem ser aplicados dinamicamente a qualquer medida selecionada, simplificando drasticamente a manutenção do modelo.
Vários modelos semânticos em um workspace precisam compartilhar tabelas de dimensão comuns (por exemplo, Date, Customer) para garantir consistência e reduzir a duplicação de dados.
→Criar um modelo semântico "central" contendo as dimensões compartilhadas. Construir outros modelos "compostos" que se conectam ao modelo central via DirectQuery e às tabelas de fatos via Direct Lake/Import.
Por quê: Esta arquitetura "hub and spoke" promove uma única fonte de verdade para as dimensões. Modelos compostos permitem combinar dados de diferentes fontes e modos de armazenamento em um modelo unificado.
Uma tabela de fatos tem várias colunas de data (por exemplo, OrderDate, ShipDate) que devem todas se relacionar com uma única tabela de dimensão de data.
→Criar um relacionamento ativo e vários relacionamentos inativos entre as tabelas de fatos e de datas. Usar a função DAX `USERELATIONSHIP()` em medidas para ativar o relacionamento inativo apropriado.
Por quê: O Power BI permite apenas um relacionamento ativo entre duas tabelas. Este padrão permite a análise por diferentes funções de data sem duplicar a tabela de dimensão.
Um modelo semântico com uma tabela de fatos grande (bilhões de linhas) leva muito tempo para ser atualizado. Apenas os últimos 30 dias de dados mudam com frequência.
→Configurar a atualização incremental na tabela de fatos. Definir os parâmetros `RangeStart` e `RangeEnd`. Definir uma política para arquivar dados antigos (por exemplo, armazenar os últimos 5 anos) e atualizar dados recentes (por exemplo, atualizar os últimos 30 dias).
Por quê: Isso reduz drasticamente o tempo de atualização e o consumo de recursos, processando apenas partições que contêm dados novos ou alterados, em vez de recarregar a tabela inteira.
Uma medida DAX complexa é lenta porque calcula repetidamente o mesmo valor intermediário dentro de sua fórmula.
→Usar variáveis (`VAR`) para armazenar o resultado do cálculo intermediário uma vez, e então referenciar a variável várias vezes na declaração `RETURN`.
Por quê: Variáveis impedem que o motor reavalie a mesma lógica várias vezes dentro de uma única execução de medida, o que melhora significativamente o desempenho, especialmente em contextos iterativos.
Criar uma medida para calcular a porcentagem de contribuição de um valor (por exemplo, vendas de produtos) para um total maior (por exemplo, todas as vendas de produtos), respeitando outros filtros (como data).
→Usar `DIVIDE([Sales], CALCULATE([Sales], ALLEXCEPT(Product, Product[Category])))` para porcentagem da categoria ou `CALCULATE([Sales], ALL(Product))` para porcentagem do total geral.
Por quê: `CALCULATE` combinado com `ALL`, `ALLEXCEPT` ou `REMOVEFILTERS` permite modificar o contexto do filtro para obter o denominador correto para o cálculo da porcentagem.
Um relatório precisa de um slicer que permita aos usuários escolher qual métrica (por exemplo, "Revenue", "Cost", "Profit") um visual deve exibir.
→Criar uma tabela desconectada com os nomes das métricas. Criar uma única medida DAX usando `SWITCH(SELECTEDVALUE(MetricTable[Metric]), "Revenue", [Total Revenue], "Cost", [Total Cost], ...)` .
Por quê: Este padrão, frequentemente usando um Parâmetro de Campo, oferece uma maneira dinâmica e amigável de alternar cálculos sem a necessidade de bookmarks ou múltiplos visuais, tornando os relatórios mais interativos e concisos.
Uma equipe de BI empresarial precisa usar ferramentas profissionais (como Visual Studio, Tabular Editor, SQL Profiler) para gerenciar, implantar e solucionar problemas de um modelo semântico do Fabric.
→Habilitar o endpoint XMLA Read/Write para o workspace.
Por quê: O endpoint XMLA expõe o modelo semântico como uma instância padrão do Analysis Services, permitindo a conectividade de um vasto ecossistema de ferramentas avançadas de BI e ALM para acesso programático e tarefas de modelagem complexas.
Um modelo Direct Lake está com desempenho lento. A investigação revela que ele está caindo de volta para o modo DirectQuery.
→Usar DAX Studio ou Performance Analyzer para identificar a consulta que causa o fallback. Causas comuns incluem funções DAX não suportadas, RLS complexo ou um lakehouse não otimizado/desatualizado.
Por quê: O Direct Lake tem limitações. Quando uma consulta usa um recurso não suportado, ele silenciosamente retorna para o motor DirectQuery, que é mais lento. Identificar e corrigir a causa raiz (por exemplo, otimizar o DAX, executar OPTIMIZE na tabela Delta) é fundamental para restaurar o desempenho.
Um modelo tem um relacionamento muitos para muitos (por exemplo, Vendas e Promoções via uma tabela ponte). As medidas estão retornando totais incorretos ao filtrar pelo lado "muitos".
→Garantir que a direção do filtro cruzado nos relacionamentos (Dimension -> Bridge -> Fact) esteja definida corretamente (tipicamente direcional única). Usar funções DAX como `TREATAS` ou `INTERSECT` para cálculos M2M mais complexos, se necessário.
Por quê: A direção incorreta do filtro cruzado é uma causa comum de resultados incorretos em modelos M2M. Embora o filtro bidirecional possa parecer funcionar, ele frequentemente leva a ambiguidade e contagem dupla. Um modelo bem definido com padrões DAX explícitos é mais robusto.
Um modelo composto usando DirectQuery em uma tabela de fatos massiva está lento. A maioria das consultas dos usuários está em um nível agregado (por exemplo, vendas mensais por categoria).
→Criar uma tabela de agregação definida pelo usuário no modo Import. A tabela de agregação deve conter dados pré-resumidos no nível de granularidade das consultas comuns (Mês, Categoria).
Por quê: O motor de consulta redirecionará automaticamente as consultas para a tabela de agregação menor e em memória sempre que possível, proporcionando enormes ganhos de desempenho. Ele só acessará a fonte DirectQuery para consultas que exigem um nível de detalhe inferior.
Calcular totais acumulados ou médias móveis complexas em DAX que estão apresentando baixo desempenho com abordagens tradicionais baseadas em filtro.
→Usar funções de janela DAX como `WINDOW` ou `OFFSET`.
Por quê: Essas funções são otimizadas especificamente para cálculos posicionais sobre um conjunto ordenado de linhas. Elas são frequentemente mais eficientes e sintaticamente mais simples do que padrões mais antigos que dependem de filtragem pesada e transições de contexto.
Calcular totais Ano-a-Data (YTD) para uma empresa com um ano fiscal que começa em 1º de julho.
→Usar as funções `TOTALYTD` ou `DATESYTD` com o parâmetro opcional `YearEndDate`. Exemplo: `TOTALYTD([Sales], 'Date'[Date], "6/30")` .
Por quê: Especificar o parâmetro de data de fim de ano é a maneira correta e mais simples de fazer com que as funções de inteligência de tempo DAX reconheçam o calendário fiscal personalizado.