Fabiano.Amaral
Exame DP-600 · Habilidades medidas em 21 de julho de 2026

Implementando Soluções de Análise com Microsoft Fabric

Um guia de estudo completo, objetivo por objetivo, construído a partir do Microsoft Learn. Cada título abaixo corresponde a um item do skills outline oficial, então você pode percorrer o outline de cima a baixo com a certeza de não deixar nada de fora.

Domínio 1
25–30%
Manter uma solução de análise de dados
Domínio 2
45–50%
Preparar dados
Domínio 3
25–30%
Implementar e gerenciar modelos semânticos
Certificação
Fabric Analytics Engineer Associate
Nota de aprovação
700 / 1000
Linguagens
SQL · KQL · DAX
Renovação
Gratuita, anual, online

Como usar este guia

Os três domínios não têm peso igual. Preparar dados sozinho vale de 45 a 50% da prova — quase metade. É onde você deve investir a maior parte do tempo. Os outros dois domínios, governança/ALM e modelos semânticos, dividem a metade restante em partes iguais.

O exame é escrito para o analytics engineer: alguém que projeta lakehouses e warehouses, prepara dados num star schema e constrói modelos semânticos de alto desempenho. Espera-se que você consulte e transforme dados em quatro dialetos — SQL, KQL, DAX e o Visual Query Editor (Power Query). A maioria das questões não é "o que essa função faz" — é "dadas estas restrições, qual store, qual storage mode, qual padrão de modelagem você escolhe, e por que não os outros".

A ordem de estudo que funciona

Leia Fundamentos do Fabric primeiro — OneLake, a taxonomia de itens, o guia de decisão de stores e os quatro storage modes são o vocabulário em que todas as outras respostas são escritas. Depois trabalhe o Domínio 2 (o maior e mais prático), então o Domínio 3 (modelos semânticos, Direct Lake e DAX) e por último o Domínio 1 (segurança e ALM), cujas questões pressupõem que você já sabe o que são um lakehouse, um warehouse e um semantic model.

Os quatro formatos de questão que você vai encontrar

Formato 1

Escolher a abordagem certa

"Você precisa de um modelo de 50 GB atualizado a cada 15 min, sem gateway. Qual storage mode?" A resposta está numa tabela de decisão. Elimine por volume, latência de dados, storage mode e persona.

Formato 2

Completar o código

Arrastar-e-soltar ou preencher T-SQL, KQL ou DAX. A pegadinha costuma ser um contexto de filtro em DAX (CALCULATE/FILTER), um JOIN errado ou a ordem dos operadores em KQL.

Formato 3

Diagnosticar a falha

Um sintoma mais o modelo. Por que o Direct Lake caiu para DirectQuery? Por que a medida está lenta? Por que o refresh incremental recarrega tudo? Decore os gatilhos de fallback e de recarga.

Formato 4

Ordenar as etapas

Sequenciar uma conexão Git, uma promoção por deployment pipeline ou a configuração de RLS. O Fabric tem pré-requisitos rígidos — habilitar o XMLA read-write antes de escrever no modelo, por exemplo.

Recursos em preview podem cair na prova

A Microsoft atualiza o DP-600 mais ou menos a cada seis meses, e recursos em preview aparecem quando são de uso comum. Onde este guia marca algo como Preview, saiba o que é e que problema resolve — ninguém vai perguntar a data de GA.

Fundamentos do Fabric (o vocabulário)

OneLake — a cópia única

O OneLake é o data lake lógico único do tenant, provisionado automaticamente, sem infraestrutura para criar. Todo item que armazena dados grava em Delta Parquet no OneLake, e é isso que permite que uma única cópia do dado seja lida por todos os engines — SQL, Spark, KQL e o Analysis Services por trás do Direct Lake — sem duplicação.

Nível 1
TenantUm OneLake. Não é opcional nem removível.
Nível 2
WorkspaceComporta-se como um container de armazenamento.
Nível 3
ItemLakehouse, Warehouse, Eventhouse… uma pasta.
Nível 4
Tables / FilesTabelas Delta gerenciadas vs. arquivos livres.
  • Delta Parquet é o formato nativo de todas as cargas. Warehouse, Lakehouse e Eventhouse gravam em Delta — a base do "one copy".
  • Ferramentas externas endereçam o OneLake como ADLS Gen2: https://onelake.dfs.fabric.microsoft.com/<workspace>/<item>/Tables/<table>.
  • Shortcuts apontam para dados em outro lugar (OneLake, ADLS, S3, GCS, Dataverse) sem copiá-los; mirroring replica um banco externo continuamente para o OneLake.

A taxonomia de itens que o analytics engineer precisa reconhecer

Data Engineering

Lakehouse

Tabelas Delta + arquivos, Spark em primeiro lugar, com um SQL analytics endpoint somente leitura anexado. Schema-on-read; suporta schemas nomeados.

Data Warehouse

Warehouse

T-SQL completo de leitura e escrita, transações ACID multi-tabela, schema-on-write. O único store do Fabric com DML de verdade e stored procedures.

Real-Time

Eventhouse · KQL Database

Store de séries temporais e logs, consultado com KQL. Pode expor seus dados no OneLake (OneLake availability) para leitura por outros engines.

Power BI

Semantic model

O modelo tabular (Analysis Services) com tabelas, relacionamentos e medidas DAX. Import, DirectQuery ou Direct Lake. É o coração do Domínio 3.

Power BI

Report · Dashboard · Paginated report

As superfícies de consumo que se conectam ao semantic model — por live connection (Build permission) em vez de importar dados.

Data Factory

Dataflow Gen2 · Pipeline · Copy job

Transformação com Power Query; orquestração; e replicação full/incremental guiada por assistente.

Escolhendo um data store — a tabela de decisão mestra

Esta tabela responde a uma fatia desproporcional das questões do Domínio 2.

StoreCarga idealPersona / habilidadeAPI de escritaTransações multi-tabela
LakehouseBig data, ML, dados não e semiestruturados, engenharia de dadosData engineer, data scientist — SparkSpark (PySpark, Scala, Spark SQL, R), pipelines, DataflowsNão
WarehouseDW corporativo, BI baseado em SQL, transações completasDesenvolvedor de DW, analytics engineer — T-SQLDML em T-SQL, COPY INTO, CTAS, pipelines, DataflowsSim
Eventhouse / KQL DBStreaming, telemetria, logs, análise de alta granularidadeDesenvolvedor de aplicações, data engineer — KQLEventstream, SDKs, Kafka, .ingestNão
SQL database no FabricOLTP operacional dentro do FabricDesenvolvedor de aplicação/banco — T-SQLT-SQL (superfície OLTP completa)Sim
Lakehouse ou Warehouse para o star schema?

Ambos servem. Escolha o Warehouse se a equipe é T-SQL e você quer DML completo, stored procedures e MERGE para carregar dimensões. Escolha o Lakehouse se a equipe é Spark/Python e há dados não estruturados. Os dois expõem um SQL analytics endpoint e alimentam Direct Lake do mesmo jeito.

Import, DirectQuery, Direct Lake e Dual

O storage mode de uma tabela decide onde os dados residem na hora da consulta. Esta é a distinção mais cobrada do Domínio 3.

ModoOnde os dados ficamLatência de consultaAtualizaçãoUse quando
ImportEm memória (VertiPaq), copiado para o modeloA mais rápidaRefresh agendado/incrementalPadrão; melhor performance; dados cabem na memória
DirectQueryFica na fonte; consulta enviada a cada visualA mais lenta (round-trip à fonte)Sempre ao vivoDados enormes ou near-real-time; sem cópia
Direct LakeLido direto do Delta no OneLake, sob demandaPerto de ImportReframing automático quando o Delta mudaGrandes volumes no OneLake sem custo de refresh do Import
DualImport e DirectQuery; o engine decideVariaAmbosDimensões em composite models, para evitar limit queries
Direct Lake não é DirectQuery

Direct Lake carrega colunas Delta direto na memória do engine tabular (transcoding), então tem performance de Import sem importar. Mas ele pode cair para DirectQuery (fallback) quando estoura um guardrail da SKU ou encontra RLS no SQL endpoint. Guarde: Direct Lake = velocidade de Import + frescor próximo do tempo real, com fallback de segurança.

Workspace roles — a matriz essencial

Quatro roles governam tudo no workspace. Decore quem pode compartilhar e quem só lê (detalhes e as pegadinhas de segurança estão no Domínio 1).

CapacidadeAdminMemberContributorViewer
Excluir o workspace · gerenciar acessos
Compartilhar itens · adicionar members
Criar / editar itens · escrever dados
Ler dados (SQL endpoint · relatórios)

SQL, KQL e DAX — quando cada uma

T-SQL

Warehouse & SQL endpoint

Modelar e transformar em batch, criar views/functions/procs, carregar dimensões com MERGE. Set-based, schema-on-write.

KQL

Eventhouse

Explorar logs e séries temporais. Pipeline de operadores (wheresummarizeproject), ótimo para telemetria de alta granularidade.

DAX

Semantic model

Definir medidas e colunas calculadas sobre o modelo tabular. Toda a análise final de BI passa por aqui — contexto de filtro é o conceito-chave.

Domínio 1 · 25–30% do exame

Manter uma solução de análise de dados

Este domínio cobre segurança, governança e o ciclo de vida do desenvolvimento no Microsoft Fabric. Domine as camadas de acesso (workspace → item → OneLake → RLS/CLS/OLS), as ferramentas de ALM (Git, deployment pipelines, .pbip, XMLA) e como avaliar o impacto de mudanças antes de deployá-las.

Habilidade 1.1Implementar segurança e governança

As camadas de acesso do Fabric

O Fabric avalia a segurança em camadas sequenciais. Um usuário precisa passar em cada camada para acessar o dado. A ordem de operação é: 1) autenticação no Microsoft Entra, 2) acesso ao Fabric, 3) segurança de dados (tabela/arquivo). Pense em três escopos de concessão: o workspace (plano de controle), o item (compartilhamento individual) e os controles de dados (OneLake, SQL, semantic model).

EscopoO que controlaComo é concedidoGranularidade
Workspace roleTodos os itens do workspace (plano de controle)Admin/Member/Contributor/Viewer atribuído a usuário ou grupoGrossa (workspace inteiro)
Item permissionUm único item (share)Compartilhar item → Read (+ Reshare, Build, Write conforme o item)Item individual
OneLake data-access rolePastas, arquivos e tabelas no OneLakeRole RBAC do OneLake (Read/ReadWrite) no lakehousePasta / arquivo / tabela
RLS / CLS / OLSLinhas, colunas e objetos dentro de uma tabela/modeloT-SQL no Warehouse; DAX/Tabular no semantic modelLinha / coluna / objeto
As três camadas de segurança

Entra authentication → Fabric access → Data security. Cada camada é avaliada em sequência; falhar em qualquer uma bloqueia o acesso. Compartilhar um item concede metadados e visualização, mas não dá acesso ao dado subjacente em SQL ou OneLake — isso exige permissão de compute ou de OneLake adicional.

Controles no nível do workspace

Existem quatro workspace roles. Elas se aplicam a todos os itens do workspace e não vazam para outros workspaces, para a capacity ou para o tenant. Quem não tem nenhuma role não acessa o workspace.

CapacidadeAdminMemberContributorViewer
Excluir o workspace
Adicionar admins
Adicionar members
Compartilhar itens / gerenciar permissões
Escrever dados / criar itens
Ler dados
Data Warehouse

Roles no Warehouse

Admin, Member e Contributor recebem acesso CONTROL em cada Warehouse e SQL analytics endpoint (leitura/escrita total + gestão de permissões SQL granulares). Viewer recebe CONNECT + ReadData.

Regra de ouro

Menor privilégio

Use Viewer para consumidores, Contributor para desenvolvedores, Member para quem precisa compartilhar, e reserve Admin para gestão. Prefira grupos de segurança a usuários individuais.

Viewer + Direct Lake

Um Viewer que abre um relatório em Direct Lake não vê os dados automaticamente: ele precisa de permissão de dados no OneLake (role DefaultReader/ReadData) ou a fonte precisa usar identidade fixa. Se houver RLS/CLS/OLS definido no SQL analytics endpoint, as queries do Direct Lake fazem fallback para DirectQuery para respeitar a segurança.

Controles no nível do item

Permissões de item controlam o acesso a um item específico, independentemente das workspace roles. Compartilhar um item concede por padrão a permissão Read (ver metadados e relatórios associados). Read não dá acesso aos dados subjacentes em SQL ou OneLake — para isso, conceda permissões de compute adicionais.

Permissão de itemO que habilita
ReadVer metadados e relatórios; padrão ao compartilhar
ReshareCompartilhar o item com outros usuários
Build (semantic model)Construir novo conteúdo sobre o dado: criar relatórios, Analyze in Excel, conectar via XMLA, exportar dados subjacentes
Write / EditModificar o item; para semantic model equivale a admin de database Analysis Services
ReadData / ReadAll (Lakehouse/Warehouse)Consultar os dados via SQL endpoint ou OneLake
Build é a chave do semantic model

Para conectar-se via XMLA e navegar em um semantic model, o usuário precisa de Build permission — mesmo que seja Admin/Member/Contributor do workspace. RLS é respeitado, e ele não vê os metadados internos do modelo.

Workspace vs item: o exemplo clássico

Se você compartilha um relatório com a Marta, ela o acessa via link independentemente da role. Mas se ela também é Viewer do workspace, remover a permissão de item não basta: ela ainda vê o relatório pelo workspace. Para bloquear totalmente, remova a permissão de item e a role Viewer.

RLS, CLS, OLS e acesso a arquivos

A segurança granular acontece em dois motores independentes: o Warehouse / SQL analytics endpoint (via T-SQL) e o semantic model (via Tabular/DAX). Separadamente, o OneLake security aplica segurança de arquivo/pasta/tabela/linha/coluna no próprio lake.

ControleOnde se defineMecanismo
RLS (linha)Warehouse/SQL endpoint · semantic model · OneLakeT-SQL SECURITY POLICY + predicate function · DAX role · role OneLake
CLS (coluna)Warehouse/SQL endpoint · OneLakeT-SQL GRANT/DENY por coluna · deny-list na role OneLake
OLS (objeto)Semantic modelTabular (Tabular Editor) esconde tabelas/colunas do modelo
Arquivo / pastaOneLakeRole OneLake Read/ReadWrite sobre o path
T-SQL · RLS no Warehouse
-- 1) Função-predicado (inline TVF) com SCHEMABINDING
CREATE FUNCTION Security.tvf_securitypredicate(@SalesRep AS nvarchar(50))
    RETURNS TABLE WITH SCHEMABINDING
AS RETURN SELECT 1 AS result
WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'manager@contoso.com';
GO
-- 2) Política que aplica o filtro sobre a tabela
CREATE SECURITY POLICY SalesFilter
ADD FILTER PREDICATE Security.tvf_securitypredicate(SalesRep)
ON sales.Orders WITH (STATE = ON);
T-SQL · CLS no Warehouse
-- Charlie vê tudo, menos a coluna sensível CreditCard
GRANT SELECT ON Customers(CustomerID, FirstName, LastName, Phone, Email)
    TO [Charlie@contoso.com];
-- SELECT * agora falha para Charlie:
-- Msg 230: The SELECT permission was denied on the column 'CreditCard'
T-SQL · OLS-like via DENY
-- Negar acesso a uma coluna inteira (deny-list)
DENY SELECT ON dbo.Payroll(Salary) TO [analysts];
-- Para OLS de tabela/coluna no semantic model, use
-- Tabular Editor sobre o modelo (não T-SQL).
OneLake ReadWrite não combina com RLS/CLS

Uma role de OneLake security com permissão ReadWrite não pode conter restrições de RLS ou CLS. RLS/CLS só valem para tabelas Delta Parquet (ou Iceberg virtualizado); em outros formatos, a role bloqueia a tabela inteira. Dentro de uma role, OLS ∩ RLS ∩ CLS (interseção); entre roles, os acessos se combinam por união (menos restritivo).

OneLake: herança e travessia de pastas

Permissão numa pasta desce para arquivos e subpastas (herança). O usuário pode listar e atravessar pastas-pai para chegar ao dado autorizado, mas isso não expõe arquivos irmãos. OneLake é deny-by-default: sem role, sem acesso. Mudanças de role levam ~5 min; mudanças em grupos, ~1 h.

Sensitivity labels

Sensitivity labels vêm do Microsoft Purview Information Protection e protegem o conteúdo contra vazamento e acesso não autorizado. Diferentemente de RLS/CLS, o label viaja com o dado: ele é herdado por itens downstream e persiste na exportação (Excel, PowerPoint, PDF), inclusive fora do Fabric.

Pré-requisitos

O que você precisa

Licença Power BI Pro ou PPU e permissão de Edit no item. Se o label aparecer esmaecido, você não tem permissão para usá-lo.

Comportamento

Herança downstream

Aplique pelo flyout no cabeçalho do item ou nas configurações. O label é herdado por relatórios/dashboards construídos sobre o dado rotulado e mantido na exportação.

Label ≠ permissão

Um sensitivity label classifica e (opcionalmente) criptografa/protege o dado; ele não substitui workspace roles nem RLS. Combine: label para governança/DLP, RLS/CLS para quem vê o quê. Atenção: labels não são suportados em Power BI projects (.pbip).

Endossar itens

Endossamento sinaliza conteúdo confiável e o destaca na busca. Há três níveis:

Promoted

Pronto para reuso

O criador considera o item pronto para compartilhar. Qualquer item (exceto dashboards) pode ser promovido por qualquer usuário com permissão de Write.

Certified

Autoridade organizacional

Um revisor autorizado atesta que o item atende aos padrões de qualidade. Só usuários definidos pelo Fabric admin (delegável a admins de domínio) podem certificar.

Master data

Fonte única da verdade

Marca dados centrais (product codes, customer lists). Só para itens que contêm dados (lakehouses, semantic models) e apenas usuários definidos pelo admin.

Habilitação por admin

Promoted está sempre disponível. Certified e Master data precisam ser habilitados pelo Fabric admin. Dashboards do Power BI não podem ser endossados de forma alguma.

Habilidade 1.2Manter o ciclo de vida do desenvolvimento

Controle de versão (Git integration)

O Git integration conecta um workspace a um branch de repositório para versionar, reverter e colaborar. A integração é no nível do workspace e preserva a estrutura de subpastas no Git.

1
ConnectConecte o workspace a um provider + repo + branch
2
CommitEnvie mudanças do workspace para o branch
3
UpdatePuxe mudanças do branch para o workspace
4
ResolveTrate conflitos quando ambos os lados mudaram
Providers

Suportados

Azure DevOps, GitHub e GitHub Enterprise — todos somente cloud. Itens não suportados no workspace são ignorados (não sincronizam, mas não são apagados).

Permissões

Dois lados

As ações dependem das permissões no workspace e no repo Git. Você precisa de acesso de escrita ao branch para commitar.

Status de sincronização

Cada item aparece com um status: Synced, Uncommitted (mudou no workspace), Update required (mudou no Git) ou Conflict (mudou nos dois). Conflitos precisam ser resolvidos manualmente antes de sincronizar.

Power BI Desktop projects (.pbip)

Preview Ao salvar como Power BI Project (.pbip), o relatório e o semantic model são gravados como arquivos de texto simples em pastas separadas — ideais para Git, diff e colaboração. Habilite em File > Options > Preview features.

Estrutura · pasta .pbip
Project/
├── AdventureWorks.Report/       -- definition.pbir (PBIR)
├── AdventureWorks.SemanticModel/ -- definition.pbism + TMDL
├── .gitignore                   -- ignora cache.abf, localSettings
└── AdventureWorks.pbip          -- ponteiro p/ a pasta Report
TMDL

Metadados do modelo

O semantic model é serializado em TMDL (texto legível), editável em VS Code ou Tabular Editor via TOM. Diffs limpos por objeto facilitam merge e code review.

PBIR

Formato do relatório

O relatório usa o formato aprimorado PBIR (definition.pbir), permitindo reusar páginas e versionar visuais individualmente.

.pbix vs .pbip no Git

O .pbix é um binário: o Git só o versiona como blob opaco (sem diff, sem merge de páginas/medidas). O .pbip é texto: você vê exatamente o que mudou e faz merge. Converte-se .pbix ⇄ .pbip apenas pelo Save as do Desktop (não programaticamente). Labels de sensibilidade não são suportados em .pbip.

Deployment pipelines

Deployment pipelines promovem conteúdo entre estágios (tipicamente Dev → Test → Prod). Git cuida do controle de versão; pipelines cuidam da promoção entre ambientes.

Dev
DevelopmentConstruir e desenvolver
Test
TestTestar com volume real
Prod
ProductionPublicar para o negócio
Estágios

2 a 10

De 2 a 10 estágios; o padrão são 3. Você pode adicionar, remover e renomear. Cada estágio é apoiado por um workspace.

Pairing

Emparelhamento

Itens são pareados entre estágios adjacentes; só itens pareados são sobrescritos no deploy. Itens não pareados geram cópia duplicada. O pareamento sobrevive à renomeação.

RegraO que faz
Deployment ruleSobrescreve a fonte de dados no estágio de destino (ex.: Dev aponta para DB de teste, Prod para DB de produção)
Parameter ruleDefine valores de parâmetros específicos por estágio
AutobindingReliga automaticamente as referências (ex.: relatório → semantic model) ao item pareado no estágio de destino
Preview e retiradas

Preview A nova UI de deployment pipelines e vários itens (Report, Semantic model, Dashboard, Paginated report, Dataflow etc.) estão em preview. A partir de 12/02/2026, semantic models sem Enhanced Metadata deixam de ser suportados em pipelines. Automatize via REST APIs.

Impact analysis de dependências

Antes de mudar um item, avalie o que quebra downstream. A lineage view mostra as conexões dentro do workspace (mais fontes externas um nível acima); a impact analysis mostra os dependentes downstream, inclusive em outros workspaces.

FerramentaEscopoUso típico
Lineage viewItens do workspace + fontes externas 1 nível upstream"De onde vêm os dados deste relatório?"
Impact analysisDependentes downstream (mesmo em outros workspaces)"O que quebra se eu mudar este lakehouse/warehouse/dataflow/semantic model?"
Notify contacts

Na impact analysis você pode notificar os contatos dos itens impactados antes de uma mudança disruptiva. Downstream em outros workspaces não aparece na lineage view — só na impact analysis. Viewers não veem as fontes de dados na lineage.

XMLA endpoint

O XMLA endpoint expõe o semantic model como se fosse um servidor Analysis Services, para ferramentas externas. É read-only por padrão (querying); operações de escrita exigem read-write.

FerramentaRead-only (query)Read-write (metadados)
Excel / Report Builder / DAX Studio
SSMS (TMSL, refresh fino)
Tabular Editor (edição de modelo/OLS)
ALM Toolkit (schema compare/deploy)
Visual Studio (SSDT)
Read-write exige DUAS coisas

Para escrever via XMLA você precisa de: 1) capacity Premium / PPU / Fabric; 2) a propriedade XMLA Endpoint = Read Write na capacity (aplica-se a todos os workspaces dela); e 3) o tenant setting "Allow XMLA endpoints and Analyze in Excel" habilitado. Além disso: uma escrita XMLA num modelo autorado no Desktop impede baixá-lo de volta como .pbix — guarde o original. Build permission é necessária para qualquer acesso via XMLA.

Casos de uso do read-write

Refresh incremental de partições específicas (sem limite de 48/dia), deploy de modelos do Visual Studio, scripts TMSL, gestão de RLS/OLS e schema compare com ALM Toolkit. Modelos em live connection a AAS/SSAS/outro workspace e push datasets não aparecem via XMLA.

Assets reutilizáveis

Reduza retrabalho reutilizando templates e fontes de dados padronizados, e conectando-se a modelos compartilhados em vez de duplicá-los.

.pbit

Template de relatório

Modelo do Power BI com estrutura, medidas e visuais, mas sem dados. Ao abrir, solicita parâmetros/credenciais e carrega. Padroniza a criação de novos relatórios.

.pbids

Conexão de dados

Arquivo que descreve uma fonte de dados pré-configurada. Abre o Desktop já no diálogo Get Data apontando para a fonte — onboarding rápido e consistente.

Shared semantic model

Live connection

Conecte-se ao vivo a um semantic model publicado (single source of truth) via Build permission, em vez de importar dados. Um modelo, muitos relatórios.

.pbip como template

Como o .pbip separa relatório e modelo em pastas de texto, ele também funciona como template de desenvolvimento: copie tabelas do semantic model entre projetos ou reuse páginas de relatório. Prefira modelos compartilhados a importar os mesmos dados N vezes.

Domínio 2 · 45–50% do exame

Preparar dados

Este é o maior domínio do DP-600 — sozinho vale quase metade da prova. Ele cobre o ciclo completo do dado no Fabric: obter (conexões, gateways, catálogo, atalhos, mirroring, copy, escolha do data store), transformar (T-SQL, PySpark e Power Query; star schema; limpeza) e consultar (Visual Query Editor, SQL, KQL e DAX). Estude com foco em decisão: para cada cenário, saiba qual ferramenta escolher e por quê. Domine as tabelas de decisão — shortcut vs mirror vs copy, e Lakehouse vs Warehouse vs Eventhouse vs SQL database — porque a prova adora esses trade-offs.

Habilidade 2.1 Obter dados

Conexões de dados e gateways

Uma conexão encapsula o endereço da fonte, o tipo de autenticação e as credenciais. No Fabric você gerencia tudo de forma centralizada em Configurações → Gerenciar conexões e gateways. A pergunta de decisão é sempre: onde a fonte vive e como o Fabric consegue alcançá-la? A resposta define se você precisa apenas de uma conexão em nuvem ou de um gateway como ponte para a rede onde o dado mora.

TipoQuando usarOnde a fonte viveInstala software?
Conexão em nuvem (cloud connection)Fonte SaaS/PaaS acessível pela internet pública (Azure SQL, ADLS Gen2, S3, Snowflake)Nuvem, endpoint público✔ Não — nativa
On-premises data gateway (OPDG)Fonte no seu datacenter/rede local, atrás do firewall corporativoOn-premisesSim — instala no host da rede local
VNet data gatewayFonte em Azure Virtual Network, atrás de private endpoint/firewallAzure VNet privada✔ Não — gerenciado pela Microsoft
Nuvem

Cloud connection

Compartilhável entre itens. Uma flag de segurança define se pode ser reutilizada por gateways. Atalhos ADLS/S3 delegam autorização via cloud connection.

On-prem

OPDG

Ponte para dados locais. Também habilita atalhos on-premises para caminhos restritos por rede. Instalado numa VM da rede local que você mantém.

Privado

VNet gateway

Sem VM para manter: a Microsoft provisiona o gateway dentro da sua VNet para alcançar recursos privados atrás de private endpoints.

Tipos de credencial / autenticação. Ao criar a conexão você escolhe como o Fabric se autentica na fonte. A opção disponível depende do conector. Para automação, prefira service principal ou Managed Identity em vez de senhas embutidas.

CredencialDescriçãoUso típico
BasicUsuário e senha da fonteBancos SQL/ODBC legados
OAuth 2.0 / conta organizacionalIdentidade Microsoft Entra ID; suporta SSO em cenários compatíveisFontes Microsoft e SaaS modernas
Service principalIdentidade de aplicativo (tenant/client id + secret) para automação sem usuárioPipelines, CI/CD, ingestão não supervisionada
Chave de conta / SASStorage account key ou token SAS com escopo/tempo limitadoAzure Blob, ADLS Gen2
AnônimoSem credencial — endpoint públicoAPIs/arquivos abertos
Chave (Key)API key ou access key da fonteS3, alguns conectores web

Compartilhamento e papéis da conexão. Uma conexão é um objeto governável: você concede papéis a outros usuários — Owner (gerencia e usa), User (usa em itens) e User with sharing (usa e reconcede). Assim uma equipe reaproveita uma única conexão sem redistribuir credenciais.

Quando o gateway é (e não é) necessário

Precisa de gateway quando a fonte está atrás de um firewall/rede privada: banco on-premises → OPDG; recurso em VNet com private endpoint → VNet gateway. Não precisa de gateway para fontes com endpoint público (Azure SQL público, ADLS Gen2, S3, Snowflake) — basta a cloud connection.

Direct Lake não usa gateway

Semantic models em Direct Lake (on OneLake ou on SQL) suportam somente conexões em nuvem — não operam através de nenhum gateway on-premises ou VNet. Se a fonte exige gateway, o modelo precisa cair para Import ou DirectQuery; Direct Lake deixa de ser opção.

OneLake catalog e Real-Time hub

São os dois pontos de descoberta do Fabric. Regra de bolso: dados analíticos em repouso → OneLake catalog; dados em movimento / streaming → Real-Time hub. Saber qual dos dois usar é frequentemente a pergunta inteira na prova.

Em repouso

OneLake catalog

Hub central para encontrar, explorar, proteger e governar itens do Fabric. A aba Explore lista itens (com filtros por workspace, domínio e tipo), abre um painel de detalhes em contexto e permite exploração ad-hoc dos dados. A aba Govern dá insights e ações recomendadas de governança para os itens que você criou.

Em movimento

Real-Time hub

Ponto único para descobrir e conectar a fontes de dados em streaming e eventos — Fabric events, Azure events (Event Hubs, Blob), streams. Você visualiza, subscreve e roteia eventos para Eventhouse, Lakehouse, Activator e outros destinos.

O que descobreOneLake catalogReal-Time hub
Natureza do dadoEm repouso (Delta, tabelas, arquivos)Em movimento (streams, eventos)
Itens listadosLakehouses, Warehouses, semantic models, KQL DBs, relatóriosEventstreams, Fabric events, Azure events
FocoGovernança, endosso, exploração ad-hocConectar, previsualizar e rotear eventos
Ação típicaExplorar dados, ver lineage, aplicar rótulosCriar eventstream, subscrever a um stream

Ingerir ou acessar dados

A decisão-mãe do domínio. Copiar move fisicamente os dados para OneLake; shortcut aponta para os dados no lugar (virtual, zero cópia); mirroring replica continuamente uma base operacional para OneLake via CDC. Se você memorizar uma única tabela deste guia, memorize esta.

CritérioShortcutMirroringCopy (job / activity)
Movimento de dadosNenhum — referência virtualRéplica contínua (CDC) para OneLakeCópia física, sob demanda/agendada
Dado fica onde?Na origem (in-place)Cópia read-only em OneLake (Delta)Em OneLake, gerenciado pelo Fabric
CustoSem duplicação de storage✔ Compute grátis; storage grátis até o limite incluídoConsome compute do pipeline
Transformação no caminhoNãoNão (só réplica)✔ Sim (mapping, schema, upsert)
Sincroniza com a origem✔ Automático (schema também)✔ Contínuo (near real-time, segundos a minutos)Só ao reexecutar
LatênciaInstantânea (lê a origem)Baixa (~segundos sob boas condições)Depende do agendamento/tamanho
Melhor paraEvitar cópia; single source of truth; bronze/onboarding rápidoBase operacional (Azure SQL, PostgreSQL, Cosmos DB) → gold analyticsELT/ETL metadata-driven, orquestração, migração
Formato proprietário → mirroring

Shortcuts em Tables exigem formato de tabela suportado (Delta). Se a origem é um banco operacional em formato proprietário e você quer a base inteira sem desenhar ingestão, mirroring é a opção. Shortcut é referência para dados que já estão num lake; mirror é réplica CDC de um banco.

Mirroring — bancos suportados e características

O mirroring replica um banco operacional para OneLake como tabelas Delta, sem ETL para construir. A computação de replicação é gratuita e cada capacity unit inclui uma cota de storage de mirroring gratuito (aproximadamente 1 TB por CU). A latência é near real-time — tipicamente segundos a poucos minutos, dependendo do volume de mudanças.

ModalidadeO que replicaFontes
Database mirroringDados e metadados, gravados como Delta no OneLake via CDCAzure SQL DB, Azure SQL MI, SQL Server, Azure Cosmos DB, Azure Database for PostgreSQL, Snowflake, Fabric SQL DB
Metadata mirroringSó a estrutura de catálogo — os dados são acessados por shortcutsAzure Databricks (Unity Catalog)
Open mirroringVocê envia os dados de mudança para uma landing zone via API públicaQualquer aplicação própria ou de ISV
  • Cria dois artefatos no workspace: o processo de replicação e um SQL analytics endpoint somente leitura sobre a cópia Delta.
  • Exige uma capacity do Fabric em execução — pausar a capacity interrompe a replicação.
  • É a rota certa quando a origem é um banco transacional que você quer analisar de forma contínua e barata, sem construir pipeline.

Tipos de shortcut

Você cria shortcuts em lakehouses e KQL databases. Eles aparecem como pastas e se comportam como links simbólicos — apagar o shortcut não afeta o alvo, mas apagar conteúdo dentro do shortcut apaga na origem se você tiver permissão lá.

CategoriaAlvos suportados
Internos (OneLake)Lakehouses, Warehouses, KQL databases, SQL databases, Mirrored Databases, Mirrored Azure Databricks Catalogs, Semantic models
ExternosADLS Gen2, Azure Blob, Amazon S3 (e S3-compatible), Google Cloud Storage, Dataverse, Iceberg, OneDrive/SharePoint
On-premisesCaminhos restritos por rede via on-premises data gateway (OPDG)
Shortcuts na pasta Tables vs Files

Na pasta Tables só é possível criar shortcuts no nível superior, e o alvo precisa estar em Delta para ser reconhecido como tabela e aparecer no SQL endpoint. Na pasta Files não há restrição de nível nem de formato. O cache de shortcut (1–28 dias) reduz custo de egress cross-cloud para S3, GCS e OPDG.

Ferramentas de cópia — qual usar

Copy job

Ingestão sem pipeline

Bulk (full), incremental (watermark) e CDC nativos, sem construir pipeline. Mais controle que mirroring, menos complexidade que Copy activity. Ideal para bronze raw a partir de fontes diversas.

Copy activity

Dentro de pipeline

Totalmente customizável: query definida pelo usuário, parametrização, staging, múltiplos destinos, orquestração com dependências. Para ELT metadata-driven complexo.

Dataflow Gen2

Power Query em escala

Transformação de baixo código com a engine Power Query, destino configurável (Lakehouse/Warehouse). Bom para self-service e limpeza visual antes de gravar.

Eventstream

Streaming

Ingestão/transformação em tempo real, no-code, roteando para Eventhouse, Lakehouse e Activator. Para dados de alta frequência e eventos.

Modo do Copy jobO que fazQuando usar
FullCopia o dataset inteiro a cada execuçãoTabelas pequenas ou primeira carga
Incremental (watermark)Copia só linhas novas/alteradas por coluna de marca (data, id)Tabelas grandes que só crescem/mudam por chave
CDCAplica inserts/updates/deletes capturados na origemFonte com change tracking e necessidade de deletes
PySpark · ler um shortcut como tabela nativa
# Um shortcut em Tables/ se comporta como tabela Delta local
df = spark.read.format("delta").load("Tables/vendas_s3")
df = spark.sql("SELECT * FROM MeuLakehouse.vendas_s3 LIMIT 1000")

Escolher entre data stores

Quatro perguntas resolvem quase todo cenário: (1) É telemetria/tempo real de alto volume? (2) Desenvolve em Spark ou T-SQL? (3) Precisa de transações multi-tabela e DML? (4) É OLTP operacional de app? Responda nessa ordem e o item cai sozinho.

1
Streaming / telemetria?Sim → Eventhouse (KQL)
2
Desenvolve em Spark?Sim → Lakehouse
3
Multi-tabela / T-SQL DML?Sim → Warehouse
4
OLTP operacional?Sim → SQL database
FatorLakehouseWarehouseEventhouseSQL database
Persona / interfaceData engineer / cientista — SparkSQL developer — T-SQLAnalista real-time — KQLDev de app — T-SQL OLTP
Linguagem primáriaPySpark, Spark SQLT-SQLKQLT-SQL
Tipo de dadoEstruturado + não estruturadoEstruturadoSemiestruturado, séries temporais, logsEstruturado operacional
Escrita / DMLSpark; SQL endpoint é read-only✔ Full T-SQL DML/DDLIngestão via stream/queued✔ OLTP transacional
Transações multi-tabelaNão (garantia por tabela Delta)✔ SimNão✔ Sim
LatênciaBatchBatch / interativa✔ Sub-segundo em séries temporaisOLTP baixa latência
Formato de storageDelta (OneLake)Delta (OneLake)Motor Kusto; Delta via OneLake availabilityDelta espelhado em OneLake
Caso de uso típicoMedallion, ML, dados heterogêneosData warehouse enterprise, BIReporting operacional em grande escala, IoTReporting operacional pequeno/médio
SQL analytics endpoint do Lakehouse

Todo Lakehouse expõe automaticamente um SQL analytics endpoint: T-SQL read-only sobre as tabelas Delta e sobre folders referenciados por shortcuts. Suporta DQL completo e DDL limitado (views e table-valued functions), mas não DML. Para escrever com T-SQL você precisa de Warehouse. Essa distinção Lakehouse-endpoint (só leitura) vs Warehouse (leitura+escrita) é campeã de pegadinha.

Integração OneLake (Eventhouse e semantic models)

O princípio do Fabric é uma cópia lógica: o dado fica em Delta no OneLake e todos os motores leem o mesmo arquivo. Três integrações caem muito na prova: OneLake availability do Eventhouse, Direct Lake lendo OneLake e shortcut de KQL para OneLake.

Eventhouse

OneLake availability

Ao ativar OneLake availability em um KQL database (ou tabela), o Eventhouse cria uma cópia lógica em Delta Lake no OneLake. Assim Spark, Warehouse, Lakehouse, notebooks e Direct Lake leem os dados KQL. A cópia em OneLake é read-only e não pode ser otimizada depois de criada. Pode ser ligada no nível do banco (aplica a tabelas novas e opcionalmente às existentes) ou de uma tabela.

Semantic model

Direct Lake lê OneLake

Direct Lake carrega tabelas Delta do OneLake direto na memória (VertiPaq), sem import e sem DirectQuery. O refresh só remapeia metadados (framing) — leva segundos. Colunas são paginadas sob demanda (transcoding on-demand).

Shortcut de KQL para OneLake. Numa KQL database você cria um shortcut apontando para tabelas Delta no OneLake e as consulta como external table. É a via oposta: em vez de expor KQL para o lake, você traz dados do lake para o motor Kusto sem copiá-los.

KQL · consultar um shortcut para OneLake
external_table('vendas_gold')
| where Regiao == "Sul"
| take 100
AspectoDirect Lake on OneLakeDirect Lake on SQL endpoint
FonteQualquer item Fabric com tabelas DeltaSomente lakehouse/warehouse (tabelas ou views)
Fallback para DirectQueryNão faz fallback✔ Faz fallback (ex.: SQL view, RLS)
Composite model✔ Combina com ImportNão
RLS do endpoint SQLNão aplica (usa acesso a arquivos no OneLake)✔ Aplica (via fallback)
Direct Lake exige Delta

Direct Lake só funciona sobre dados em Delta no OneLake. Tipos complexos, Binary e GUID não são suportados (converta para string). Requer capacidade Fabric (SKU F) e workspace na mesma região da fonte. Ultrapassar os limites de linhas/memória do SKU faz o modelo cair para DirectQuery (só no on SQL endpoint) ou falhar (on OneLake).

Habilidade 2.2 Transformar dados

Views, functions e stored procedures

No Warehouse você tem T-SQL completo (DQL + DML + DDL). Use views para encapsular lógica de leitura, funções para lógica reutilizável (escalares e inline TVFs) e stored procedures para pipelines de transformação com DML. No SQL analytics endpoint do Lakehouse a superfície é read-only: só views e TVFs, sem procedures com DML.

ObjetoPara quêWarehouseSQL endpoint do Lakehouse
VIEWEncapsular consulta reutilizável
Inline TVFView parametrizada (retorna tabela)
Função escalarCálculo que retorna um valor
PROCEDURE (DML)Carga/transformação com INSERT/UPDATE/MERGENão (read-only)
T-SQL · CREATE VIEW
CREATE VIEW dbo.vw_vendas_gold AS
SELECT d.ano, d.mes, p.categoria,
       SUM(f.valor) AS total
FROM dbo.fato_vendas f
JOIN dbo.dim_data d    ON f.data_key = d.data_key
JOIN dbo.dim_produto p ON f.prod_key = p.prod_key
GROUP BY d.ano, d.mes, p.categoria;
T-SQL · CREATE FUNCTION (inline TVF)
CREATE FUNCTION dbo.fn_vendas_por_ano (@ano INT)
RETURNS TABLE AS
RETURN (
  SELECT p.categoria, SUM(f.valor) AS total
  FROM dbo.fato_vendas f
  JOIN dbo.dim_data d ON f.data_key = d.data_key
  JOIN dbo.dim_produto p ON f.prod_key = p.prod_key
  WHERE d.ano = @ano
  GROUP BY p.categoria
);
T-SQL · CREATE PROCEDURE (só Warehouse)
CREATE PROCEDURE dbo.sp_carrega_gold AS
BEGIN
  TRUNCATE TABLE dbo.agg_vendas_mes;

  INSERT INTO dbo.agg_vendas_mes (ano, mes, total)
  SELECT d.ano, d.mes, SUM(f.valor)
  FROM dbo.fato_vendas f
  JOIN dbo.dim_data d ON f.data_key = d.data_key
  GROUP BY d.ano, d.mes;
END;

Enriquecer. Adicionar colunas ou tabelas derivadas (computadas) que agregam contexto de negócio — margem, faixa etária, flag de churn — antes do consumo por BI. A operação existe nos três dialetos.

PySpark

withColumn

df.withColumn("margem", col("preco")-col("custo"))

T-SQL

Coluna computada

ALTER TABLE ... ADD margem AS (preco-custo)

Power Query

Coluna personalizada

Adicionar coluna → fórmula M [preco]-[custo]

Implementar um star schema

O star schema é a estrutura preferida para modelagem analítica: uma tabela fato central (eventos mensuráveis — vendas, cliques, visitas) cercada de tabelas dimensão (contexto descritivo — produto, cliente, data). Aplica-se tanto ao lakehouse quanto ao warehouse. Cada fato usa surrogate keys (chaves substitutas geradas) para apontar às dimensões, isolando o modelo das chaves naturais da origem.

ElementoFatoDimensão
ConteúdoMétricas numéricas + chaves estrangeirasAtributos descritivos + surrogate key
GranularidadeUma linha por eventoUma linha por membro
CardinalidadeMuitas linhas (lado "muitos")Poucas linhas (lado "um")
ChaveFK surrogate para cada dimensãoSurrogate key (PK) + business key
Exemplosfato_vendas, fato_visitasdim_produto, dim_cliente, dim_data

Slowly Changing Dimensions (SCD). Gerenciam mudança de atributos de dimensão ao longo do tempo.

TipoComportamentoHistórico
Type 1Sobrescreve o valor antigoNenhum
Type 2Nova linha com surrogate key, StartDate/EndDate e IsCurrent✔ Completo (versionado)
Type 3Coluna extra guardando o valor anteriorLimitado (só a versão imediatamente anterior)
1
Detecta mudançaCompara origem vs dimensão atual
2
Expira versão antigaEndDate = hoje, IsCurrent = 0
3
Insere nova versãoNova surrogate key, IsCurrent = 1
4
Fato aponta à versãoFK usa surrogate key vigente na data
Membro inferido (inferred member)

Quando um fato chega antes da sua dimensão (a chave existe no fato mas não na dimensão), você insere um membro inferido: uma linha de dimensão placeholder com a business key e atributos nulos/desconhecidos, para não perder o fato. Depois o processo de dimensão preenche os atributos reais.

T-SQL · MERGE (upsert de dimensão, SCD Type 1)
MERGE dbo.dim_cliente AS tgt
USING staging.cliente AS src
   ON tgt.cliente_id = src.cliente_id
WHEN MATCHED THEN UPDATE SET
   tgt.email = src.email, tgt.cidade = src.cidade
WHEN NOT MATCHED THEN
   INSERT (cliente_id, email, cidade)
   VALUES (src.cliente_id, src.email, src.cidade);
PySpark · dimensão com surrogate key
dim = (spark.table("staging.cliente")
  .dropDuplicates(["cliente_id"])
  .withColumn("cliente_key",
      monotonically_increasing_id()))
dim.write.format("delta") \
   .mode("overwrite") \
   .saveAsTable("gold.dim_cliente")

Desnormalizar e agregar

Desnormalizar = achatar tabelas relacionadas em uma só, reduzindo joins em tempo de query (troca storage por velocidade de leitura). Agregar = pré-somar em uma granularidade mais grossa para acelerar dashboards. A mesma operação de agregação, lado a lado nos três dialetos:

PySpark · groupBy + agg
from pyspark.sql import functions as F
agg = (df.groupBy("ano", "mes", "categoria")
         .agg(F.sum("valor").alias("total"),
              F.countDistinct("cliente_id").alias("clientes")))
agg.write.mode("overwrite").saveAsTable("gold.agg_vendas")
T-SQL · GROUP BY
SELECT ano, mes, categoria,
       SUM(valor) AS total,
       COUNT(DISTINCT cliente_id) AS clientes
FROM dbo.fato_vendas f
JOIN dbo.dim_data d ON f.data_key = d.data_key
GROUP BY ano, mes, categoria;
Power Query (M) · agrupar
let
  Fonte = fato_vendas,
  Agrup = Table.Group(Fonte,
    { "ano", "mes", "categoria" },
    { { "total", each List.Sum([valor]), type number } })
in
  Agrup
Desnormalizar não é sempre bom

Uma tabela achatada acelera leitura, mas infla storage e dificulta manutenção (um atributo de dimensão que muda precisa ser reescrito em todas as linhas). O star schema desnormaliza dentro das dimensões mas mantém fato e dimensão separados — é o equilíbrio que a prova espera.

Merge e join

Combinar tabelas por chave. Cuidado com o tipo de join (inner descarta não-correspondentes; left preserva a esquerda) e com fan-out (join com dimensão duplicada infla o fato).

TipoRetornaPySparkT-SQL
InnerSó correspondências dos dois lados"inner"INNER JOIN
Left (outer)Toda a esquerda + match da direita"left"LEFT JOIN
Right (outer)Toda a direita + match da esquerda"right"RIGHT JOIN
Full (outer)Tudo dos dois lados"full"FULL JOIN
Left antiEsquerda sem correspondência (o que falta)"left_anti"WHERE NOT EXISTS
Left semiEsquerda que tem correspondência (sem colunas da direita)"left_semi"WHERE EXISTS
ObjetivoPySparkT-SQLPower Query
Enriquecer fato com dimensãodf1.join(df2, "chave", "left")LEFT JOIN dim ON f.k = dim.kMesclar Consultas → Junção à Esquerda Externa
Só correspondentesjoin(df2, "chave", "inner")INNER JOINJunção Interna
Anti-join (o que falta)join(df2, "chave", "left_anti")WHERE NOT EXISTS (...)Junção Anti à Esquerda
PySpark · join encadeado
vendas_enr = (fato
  .join(dim_produto, "prod_key", "left")
  .join(dim_cliente, "cliente_key", "left")
  .select("data_key", "categoria",
          "segmento", "valor"))
Broadcast join

No Spark, quando um lado do join é pequeno (uma dimensão), use broadcast para enviar essa tabela a todos os executores e evitar shuffle — muito mais rápido. fato.join(F.broadcast(dim), "k", "left"). Fato grande contra dimensão pequena é o cenário clássico.

Duplicados, ausentes e nulos

Limpeza é obrigatória antes do star schema. Identifique duplicados por chave de negócio, decida a política para nulos (remover, imputar ou sinalizar) e documente. Cada operação nos três dialetos:

ProblemaPySparkT-SQLPower Query
DuplicadosdropDuplicates(["k"])ROW_NUMBER() OVER(PARTITION BY k)=1Table.Distinct / Remover Duplicatas
Imputar nulofillna({"v":0})ISNULL(v,0) / COALESCE(v,0)Table.ReplaceValue / Substituir Valores
Filtrar nulofilter(col("x").isNotNull())WHERE x IS NOT NULLRemover Linhas em Branco
PySpark · dedup + nulos
limpo = (bruto
  .dropDuplicates(["pedido_id"])
  .fillna({"desconto": 0, "canal": "desconhecido"})
  .filter(F.col("cliente_id").isNotNull()))
T-SQL · dedup por ROW_NUMBER (mantém a mais recente)
WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (
    PARTITION BY pedido_id
    ORDER BY atualizado_em DESC) AS rn
  FROM staging.pedidos
)
SELECT * FROM ranked WHERE rn = 1;
Power Query (M) · remover duplicatas e imputar
let
  Fonte = staging_pedidos,
  SemDup = Table.Distinct(Fonte, { "pedido_id" }),
  Imputa = Table.ReplaceValue(SemDup,
    null, 0, Replacer.ReplaceValue, { "desconto" })
in
  Imputa

Converter tipos e filtrar

Tipos corretos evitam erros de agregação e melhoram compressão. Converta na camada silver, e filtre cedo (predicate pushdown) para reduzir volume antes das transformações caras. Prefira TRY_CAST/TRY_CONVERT para conversões que podem falhar — retornam NULL em vez de quebrar a query.

OperaçãoPySparkT-SQLPower Query
Converter tipocol("v").cast("decimal(18,2)")CAST(v AS DECIMAL(18,2))Table.TransformColumnTypes
Conversão seguracast(...) retorna null se falharTRY_CAST / TRY_CONVERTAlterar Tipo com Locale
Filtrar linhasfilter(col("ano")=2026)WHERE ano = 2026Table.SelectRows
Data de stringto_date(col("d"),"yyyy-MM-dd")TRY_CONVERT(DATE, d)Tipo → Data
ConceitoPySpark / Spark SQLT-SQL (Warehouse)
InteiroIntegerType / LongTypeINT / BIGINT
DecimalDecimalType(p,s)DECIMAL(p,s)
TextoStringTypeVARCHAR(n)
Data / horaDateType / TimestampTypeDATE / DATETIME2
BooleanoBooleanTypeBIT
PySpark · cast + filter (early filter)
silver = (bronze
  .filter(F.col("valor").isNotNull())
  .withColumn("valor", F.col("valor").cast("decimal(18,2)"))
  .withColumn("data", F.to_date("data_str", "yyyy-MM-dd"))
  .filter(F.col("valor") > 0))

Habilidade 2.3 Consultar e analisar dados

Quatro linguagens, quatro contextos. Saiba qual usar onde: Visual Query Editor (no-code sobre lakehouse/warehouse), SQL (endpoint/warehouse), KQL (Eventhouse) e DAX (semantic model). Escolher a linguagem certa para a fonte certa é exatamente o que a prova testa.

Visual Query Editor

Editor no-code baseado no diagrama do Power Query. Você arrasta operações (selecionar colunas, filtrar linhas, agrupar, mesclar) e o Fabric gera o M/SQL por trás. Disponível no SQL analytics endpoint do Lakehouse e no Warehouse. Ideal para select/filter/aggregate sem escrever código, e você pode salvar o resultado como view diretamente.

No-code

Visual Query

Diagrama Power Query. Arraste transformações; ótimo para prototipar e para quem não domina SQL. Botão Save as view materializa a consulta.

Code

SQL Query editor

T-SQL escrito à mão no mesmo endpoint. Controle fino, window functions, CTEs. Use quando o visual não expressa a lógica.

Visual vs SQL query editor

O mesmo endpoint oferece o Visual Query Editor (diagrama Power Query, no-code) e o SQL Query editor (T-SQL escrito à mão). Use o visual para prototipar; refine em SQL quando precisar de controle fino. Ambos podem virar view.

SQL

T-SQL via SQL analytics endpoint (leitura sobre lakehouse) ou diretamente no Warehouse (leitura e escrita). É a linguagem de consulta padrão para dados tabulares Delta. Domine WHERE, GROUP BY, HAVING e window functions (ROW_NUMBER, RANK, SUM() OVER).

T-SQL · select/filter/group/having
SELECT p.categoria,
       COUNT(*) AS pedidos,
       SUM(f.valor) AS receita
FROM dbo.fato_vendas f
JOIN dbo.dim_produto p ON f.prod_key = p.prod_key
JOIN dbo.dim_data d    ON f.data_key = d.data_key
WHERE d.ano = 2026
GROUP BY p.categoria
HAVING SUM(f.valor) > 10000
ORDER BY receita DESC;
T-SQL · window function (ranking por categoria)
SELECT categoria, produto, receita,
       RANK() OVER (
         PARTITION BY categoria
         ORDER BY receita DESC) AS posicao
FROM dbo.vw_receita_produto;

KQL

Kusto Query Language em um KQL queryset sobre o Eventhouse. Read-only e otimizado para séries temporais e logs. Operadores-chave: where (filtra), project (seleciona colunas), summarize (agrega por), extend (coluna calculada), join (combina tabelas), top (N maiores), take (amostra).

Operador KQLEquivalente SQLFaz
whereWHEREFiltra linhas
projectSELECT (colunas)Escolhe/renomeia colunas
extendSELECT expr AS colCria coluna calculada
summarizeGROUP BY + aggAgrega por chave
topORDER BY + TOPN maiores por expressão
KQL · where / summarize / extend / project / top
Vendas
| where Timestamp > ago(30d)
| where Categoria == "Eletronicos"
| summarize Receita = sum(Valor),
            Pedidos = count()
    by bin(Timestamp, 1d), Regiao
| extend Ticket = Receita / Pedidos
| project Timestamp, Regiao, Receita, Ticket
| top 100 by Receita desc
KQL · join entre duas tabelas
Vendas
| join kind=inner (
    Produtos | project ProdId, Categoria
  ) on ProdId
| summarize Receita = sum(Valor) by Categoria

DAX

DAX query view no Power BI executa consultas DAX sobre o semantic model. Toda consulta começa com EVALUATE retornando uma tabela. SUMMARIZECOLUMNS agrupa e agrega — o padrão para inspecionar medidas sem construir um visual. TOPN corta os N maiores; FILTER aplica predicados.

DAX · EVALUATE + SUMMARIZECOLUMNS + FILTER
EVALUATE
SUMMARIZECOLUMNS (
    dim_produto[categoria],
    dim_data[ano],
    FILTER ( dim_data, dim_data[ano] = 2026 ),
    "Receita", SUM ( fato_vendas[valor] ),
    "Pedidos", COUNTROWS ( fato_vendas )
)
ORDER BY [Receita] DESC
DAX · TOPN (5 categorias por receita)
EVALUATE
TOPN (
    5,
    SUMMARIZECOLUMNS (
        dim_produto[categoria],
        "Receita", SUM ( fato_vendas[valor] )
    ),
    [Receita], DESC
)
Uma linguagem por contexto

SQL → dados tabulares Delta (lakehouse/warehouse). KQL → telemetria/logs no Eventhouse. DAX → medidas e relacionamentos no semantic model. Visual Query Editor → o mesmo que SQL, mas sem escrever código. Escolher a linguagem certa para a fonte certa é exatamente o que a prova testa.

Domínio 3 · 25–30% do exame

Implementar e gerenciar modelos semânticos

O maior domínio do exame. Você desenha o modelo (storage mode, star schema, relacionamentos, DAX, calculation groups) e depois o otimiza em escala (Performance Analyzer, DAX Studio/VertiPaq, Direct Lake, incremental refresh). Decida primeiro o storage mode de cada tabela — ele governa performance, frescor dos dados e limites de capacidade. Habilidades medidas em 21/07/2026; recursos em preview estão marcados.

Habilidade 3.1Projetar e construir modelos semânticos

Escolher um storage mode

O storage mode é uma propriedade por tabela. Um modelo com tabelas em modos diferentes é um composite model. Import e Direct Lake são processados pela engine VertiPaq (in-memory); DirectQuery traduz o DAX para a linguagem nativa da fonte (SQL) e federa a query.

CritérioImportDirectQueryDirect LakeDual
Engine de queryVertiPaq (memória)Federada à fonteVertiPaq (memória)VertiPaq ou fonte
Cópia dos dados✔ snapshot completo— (lê Delta on-demand)cache quando útil
Frescor dos dadosna última refreshtempo realúltimo framingdepende
Performance típicaRápidaMais lentaRápida (~Import)Otimiza junções
FonteQualquer conectorConector com DQDelta no OneLakeFonte com Import+DQ
LicençaQualquer (inclui Free)Qualquer (inclui Free)Só capacidade Fabric (F/P SKU)Qualquer
Uso idealSelf-service, dados médiosFonte volátil, sem cacheCamada gold, grandes volumesDimensões em composite
Decisão rápida

Volumes grandes em OneLake e projeto IT-driven lake-centric → Direct Lake. Analista self-service que precisa de Power Query e agilidade → Import. Fonte que precisa refletir tempo real sem cache → DirectQuery. Dimensões que servem tabelas Import e DirectQuery num mesmo modelo → Dual.

Mudança de modo é limitada

Só dá para trocar o storage mode se a tabela foi criada em DirectQuery ou Direct Lake on OneLake. DirectQuery → Import ou Dual (sem volta). Direct Lake on OneLake → Import via semantic link labs em notebooks Fabric.

Star schema no modelo semântico

O star schema é o alicerce: tabelas fato (métricas transacionais, muitas linhas) no centro, ligadas a tabelas dimensão (atributos descritivos, poucas linhas) por relacionamentos um-para-muitos. Prefira star a snowflake — menos junções, filtros mais simples, DAX mais previsível.

Fato

Grão único

Uma linha por evento no grão definido. Guarde chaves estrangeiras + valores numéricos aditivos. Marque a tabela de datas como date table para time intelligence.

Dimensão

Desnormalize

Colapse hierarquias snowflake numa só dimensão. Coluna do lado "um" precisa ser única — Direct Lake falha a query se houver duplicatas.

Chaves

Surrogate

Use chaves inteiras estreitas. Em Direct Lake, tipos de dados relacionados devem coincidir; binary/GUID não são suportados — converta para string.

Relacionamentos, bridge e many-to-many

Cada relacionamento tem cardinalidade (1:*, 1:1, *:*), direção de cross-filter (single/both) e estado ativo/inativo. Só um relacionamento ativo pode existir entre duas tabelas; os demais ficam inativos e são ativados sob demanda com USERELATIONSHIP dentro de CALCULATE.

Cross-filterSingle (recomendado)Both (bidirecional)
Direção do filtroDimensão → fatoAmbos os lados
Uso típicoStar schema clássicoMany-to-many via bridge; filtrar dimensão pela fato
RiscoBaixo, previsívelAmbiguidade, caminhos circulares, performance
AlternativaPreferir CROSSFILTER/TREATAS pontual

Para relação muitos-para-muitos entre duas dimensões (ex.: Cliente × Conta), insira uma bridge table com os pares distintos de chaves e conecte cada dimensão à bridge por 1:*. Ative cross-filter both na bridge apenas se precisar propagar o filtro. Relacionamentos *:* diretos existem, mas geram relacionamentos "limitados" e devem ser usados com cautela.

DAX · USERELATIONSHIP em relacionamento inativo
// Vendas tem 2 datas: OrderDate (ativo) e ShipDate (inativo)
Vendas por Envio =
CALCULATE (
    [Total Vendas],
    USERELATIONSHIP ( Vendas[ShipDateKey], 'Date'[DateKey] )
)

DAX: variáveis, iteradores, windowing

Use variáveis (VAR/RETURN) para clareza e performance — cada VAR é avaliada uma vez, no contexto onde é declarada, e reutilizada. Iteradores (SUMX, AVERAGEX) avaliam uma expressão linha a linha. Para table filtering, combine CALCULATE + FILTER/ALL/KEEPFILTERS. Information functions (SELECTEDVALUE, HASONEVALUE, ISFILTERED, ISINSCOPE) inspecionam o contexto.

DAX · VAR/RETURN + iterador + DIVIDE seguro
Margem % =
VAR Receita = SUMX ( Vendas, Vendas[Qtd] * Vendas[Preco] )
VAR Custo   = SUMX ( Vendas, Vendas[Qtd] * Vendas[CustoUnit] )
VAR Lucro   = Receita - Custo
RETURN
    DIVIDE ( Lucro, Receita )   // evita erro de divisão por zero
DAX · CALCULATE + FILTER + KEEPFILTERS
Vendas Alto Valor =
CALCULATE (
    [Total Vendas],
    KEEPFILTERS ( FILTER ( Vendas, Vendas[Preco] > 1000 ) )
)

Windowing (WINDOW, OFFSET, INDEX, RANK) opera sobre uma tabela ordenada com ORDERBY/PARTITIONBY — ideal para variações período-a-período sem time intelligence tradicional.

DAX · OFFSET para mês anterior
Vs Mês Anterior =
VAR Atual = [Total Vendas]
VAR Anterior =
    CALCULATE (
        [Total Vendas],
        OFFSET ( -1, ALLSELECTED ( 'Date'[Mes] ), ORDERBY ( 'Date'[Mes] ) )
    )
RETURN Atual - Anterior

Calculation groups, DFS e field parameters

Um calculation group substitui dezenas de medidas repetidas (MTD, QTD, YTD, PY…) por calculation items reutilizáveis. SELECTEDMEASURE() é o placeholder da medida em contexto. Exige Discourage implicit measures = true — calculation items só se aplicam a medidas explícitas.

DAX · calculation item YTD com SELECTEDMEASURE
// item "YTD" do grupo Time Intelligence
CALCULATE ( SELECTEDMEASURE (), DATESYTD ( 'Date'[Date] ) )

Precedência: quando dois calculation groups se aplicam à mesma medida, o de maior precedência é aplicado por fora (avaliado primeiro), e seu SELECTEDMEASURE() é substituído pelo grupo de precedência menor, até chegar à medida.

AspectoComportamento
Maior precedênciaAplicado por fora (outermost): (SELECTEDMEASURE()+2)*2 se Times2=200 e Plus2=100
Menor precedênciaAninhado por dentro, mais próximo da medida base
Dynamic format stringSó o do grupo de maior precedência é aplicado
Medida com DFS própriaTratada como precedência menor que qualquer calculation group
Ordinal vs precedenceOrdinal só ordena na exibição; não muda a ordem de avaliação

Dynamic format strings (DFS) aplicam formato condicional sem forçar a medida a virar texto. Ex.: item YOY% sobrescreve o formato para 0.00%;-0.00%;0.00%; use SELECTEDMEASUREFORMATSTRING() para reverter ao formato base.

Field parameters e sideways recursion

Field parameters deixam o usuário trocar dinamicamente quais medidas ou dimensões um visual exibe (criam uma tabela calculada implícita). Sideways recursion: um calculation item pode referenciar outro do mesmo grupo (YOY% usa YOY e PY) desde que em statements CALCULATE separados. RLS e OLS não são suportados na própria tabela do calculation group.

Large semantic model storage format

O Large semantic model storage format remove o limite de 1 GB por modelo, permitindo modelos que crescem até o limite da capacidade. Habilite antes da primeira refresh, especialmente com incremental refresh de modelos que podem passar de 1 GB.

Quando

Modelos grandes

Modelo pode exceder 1 GB, ou usa incremental refresh com bilhões de linhas. Exige capacidade Premium/Fabric.

Como

Configuração

Ative nas settings do modelo (ou default do workspace) antes da 1ª refresh. Reduz risco de estourar o limite de tamanho.

XMLA

Ferramentas

Habilita o endpoint XMLA read-write para SSMS, Tabular Editor, ALM Toolkit — gestão de partições e deploy metadata-only.

Composite models

Um composite model mistura storage modes num só modelo. O modo Dual é a peça-chave: uma tabela Dual age como Import (quando serve tabelas Import) ou como DirectQuery (quando serve tabelas DQ), reduzindo limited relationships e melhorando junções. A propagação Dual percorre só o lado "um" dos relacionamentos 1:*.

RecursoDirect Lake on OneLakeDirect Lake on SQL endpoint
Composite (mix de modos)✔ combina com Import (web) e DirectQuery (XMLA)— não combina com DQ/Dual no mesmo modelo
Aggregations definidas pelo usuário

Aggregations: tabelas de agregação Import sobre tabelas DirectQuery aceleram queries — o motor redireciona a query para a agregação quando possível e faz fallback à fonte quando não. Source groups organizam tabelas por fonte no composite. Limitações: coluna calculada em tabela DirectQuery só referencia colunas da mesma tabela; SAP HANA/BW não entram em composite.

Habilidade 3.2Otimizar modelos em escala empresarial

Performance de queries e visuais

Use o Performance Analyzer (Power BI Desktop) para medir, por visual, o tempo de DAX query, visual display e other. Copie a query DAX de um visual lento para o DAX Studio e analise Server Timings.

Reduzir

Menos visuais

Cada visual gera ≥1 query DAX. Reduza o número de visuais por página; evite muitos cards e slicers redundantes.

Evitar

Padrões caros

Evite colunas de alta cardinalidade em slicers, medidas implícitas e filtros bidirecionais desnecessários.

Medir

Performance Analyzer

Ordene por DAX query. Isole o gargalo: engine de query lento ≠ renderização lenta.

Melhorar performance de DAX

Toda query DAX divide-se entre a formula engine (FE) — single-thread, resolve lógica complexa — e a storage engine (SE) — multi-thread, cacheável, varre o VertiPaq. Empurre o trabalho para a SE; grandes materializações e callbacks para a FE são o sintoma clássico de DAX lento.

AspectoFormula engine (FE)Storage engine (SE / VertiPaq)
ThreadingSingle-threadMulti-thread
CacheNão cacheávelCache de dados reutilizável
FunçãoLógica, iteração complexa, junçõesScan/agregação de colunas comprimidas
Meta de tuningMinimizar CallbackDataID e materializaçãoMaximizar % do tempo aqui
Checklist de DAX rápido

Use variáveis para não reavaliar subexpressões; troque divisões por DIVIDE; evite iteradores aninhados (SUMX dentro de SUMX sobre tabelas grandes); prefira funções que a SE resolve sozinha. Use VertiPaq Analyzer (no DAX Studio) para achar colunas caras — alta cardinalidade e dicionários grandes dominam o tamanho e a memória do modelo.

Configurar Direct Lake

Direct Lake lê colunas de Delta tables no OneLake sob demanda. Entenda o ciclo: framing (metadados) → transcoding (carga de coluna) → query → possível fallback. Refresh em Direct Lake é framing: copia só metadados e aponta para os Parquet mais recentes — segundos, não a cópia completa do Import.

1
FramingRefresh analisa o Delta log; define o baseline point-in-time; pode evict colunas residentes
2
TranscodingNa 1ª query que pede a coluna, carrega-a inteira do OneLake para a memória (fica residente)
3
QueryVertiPaq responde da memória; futuras queries só com colunas residentes não recarregam
4
FallbackSó no on SQL: se condição não é atendida, cai para DirectQuery no SQL endpoint

Automatic updates ("Keep your Direct Lake data up to date"), ligado por padrão, dispara framing quando detecta mudança no Delta — escopado só às tabelas alteradas. Desligue para segurar dados até o ETL terminar; refaça framing manual, por agenda, REST API ou TOM. Após um erro não-recuperável, o Power BI suspende os updates automáticos até uma refresh on-demand bem-sucedida.

DirectLakeBehavior (só on SQL)Comportamento
Automatic (default)Se a condição falha, cai silenciosamente para DirectQuery. Uso em produção.
DirectLakeOnlySe a condição falha, a query dá erro. Uso em desenvolvimento para achar problemas.
DirectQueryOnlySempre DirectQuery. Uso para medir performance de fallback.
Guardrails e diagnóstico

Limites por SKU (Parquet files/table, row groups, linhas, tamanho, memória). Estourar guardrail: on OneLake a refresh falha; on SQL faz fallback (se habilitado). Diagnostique com EVALUATE TABLETRAITS() — a coluna [DirectLakeFallbackInfo] mostra o motivo; None = em Direct Lake. Corrija view não-materializada, RLS/OLS no SQL, tabela não-framed ou OPTIMIZE/VACUUM no Delta.

Direct Lake: OneLake vs SQL endpoint

Duas variantes com trade-offs distintos, sobretudo em segurança e fallback.

CritérioDirect Lake on OneLakeDirect Lake on SQL endpoint
FontesUma ou mais fontes Fabric com DeltaUma única fonte (lakehouse ou warehouse)
DirectQuery fallback— não suporta (roda DirectLakeOnly)✔ cai para DQ via SQL endpoint
Composite model✔ combina com Import (e DQ via XMLA)— não no mesmo modelo
Views SQL / OLS / DDM no endpointNão observa (exige acesso aos arquivos OneLake)Suportado — mas força fallback
RLS do SQL endpointNão aplicada (usa segurança OneLake)Aplicada — mas query cai para DQ
RLS do modelo semântico✔ (recomenda fixed identity)✔ (recomenda fixed identity)
RecomendaçãoNovos modelos, DAX plans mais eficientes, integração OneLakeReuso do SQL endpoint, views, segurança granular no SQL
Regra prática

Para novos modelos, prefira Direct Lake on OneLake: sem fallback, planos DAX mais enxutos e composite com Import. Escolha on SQL endpoint quando precisar de views, segurança granular (RLS/OLS/DDM) definida no SQL, ou compatibilidade com o endpoint existente — aceitando o risco de fallback para DirectQuery.

Incremental refresh

Incremental refresh particiona a tabela e refresca só o período recente, usando dois parâmetros Power Query date/time de nomes reservados e case-sensitive: RangeStart (mais antigo) e RangeEnd (mais recente). Você filtra a coluna de data por eles; o serviço sobrescreve os valores por partição na hora do refresh (padrão de janela deslizante — rolling window).

Power Query · filtro por RangeStart/RangeEnd
let
  Source = Sql.Database("srv", "DW"),
  Data = Source{[Schema="dbo", Item="FactSales"]}[Data],
  Ini = Table.SelectRows(Data, each [OrderDate] >= RangeStart),
  Fim = Table.SelectRows(Ini,  each [OrderDate] < RangeEnd)
in Fim
SettingPapel
Archive data starting before (store)Período histórico total mantido no modelo (janela deslizante).
Incrementally refresh starting beforePeríodo recente refrescado a cada operação (ex.: últimos 3 dias).
Get latest data with DirectQueryPartição DQ em tempo real além do período — só Premium (hybrid table).
Only refresh complete daysSó dias inteiros; obrigatório se a partição DQ real-time estiver ligada.
Detect data changesColuna last-updated (≠ da de partição); refresca só períodos que mudaram.
Query folding é obrigatório

O filtro RangeStart/RangeEnd precisa fazer folding até a fonte; senão a engine puxa a tabela inteira e busca localmente — derrubando o ganho. Com partição DQ real-time, transformações não-folding não são permitidas. Todas as partições vêm de uma única fonte. Após publicar, não dá para baixar o .pbix de volta. UTC é o padrão de "data atual" salvo timezone configurado.

Folhas de consulta

Números que vale decorar

ValorA que se aplica
700 / 1000Nota de aprovação
25–30% · 45–50% · 25–30%Pesos: Manter a solução · Preparar dados · Modelos semânticos
2 a 10 (padrão 3)Estágios de um deployment pipeline
4 storage modesImport · DirectQuery · Direct Lake · Dual
48 refreshes/diaLimite de refresh agendado (Pro); XMLA read-write contorna com partições
RangeStart · RangeEndParâmetros reservados (case-sensitive) do refresh incremental
1 relacionamento ativo por parSó um caminho ativo entre duas tabelas; os demais exigem USERELATIONSHIP
Single vs BothDireção de cross-filter de um relacionamento
Large semantic model formatExige capacity Premium/PPU/Fabric + XMLA para modelos grandes
~5 min · ~1 hPropagação de mudança de OneLake role · de mudança de grupo

Fluxogramas de decisão em palavras

"Onde estes dados devem ficar?"

Streaming/telemetria/logs, pessoal de KQL → Eventhouse. DML completo em T-SQL e transações multi-tabela → Warehouse. Spark, não estruturado, ML → Lakehouse. Aplicação OLTP → SQL database no Fabric. Já existe em outro lake → shortcut. Banco operacional a replicar continuamente → mirror.

"Qual storage mode do modelo?"

Melhor performance e cabe na memória → Import. Volume enorme no OneLake sem custo de refresh → Direct Lake. Near-real-time sem cópia, ou fonte gigante → DirectQuery. Dimensão compartilhada num composite model → Dual.

"Por que a medida está lenta?"

Iteradores aninhados ou context transition cara → reescreva com SUMX enxuto e variáveis. Storage engine ocioso e formula engine em 100% → materialize com variáveis. Bidirectional cross-filter → troque por single + CROSSFILTER. Direct Lake caiu para DirectQuery → verifique guardrails e RLS.

"Quem pode ver o quê?"

Workspace inteiro → workspace role. Um item → item permission (+ Build para o modelo). Pastas/tabelas do OneLake → OneLake role. Linhas → RLS. Colunas → CLS. Tabelas/colunas do modelo → OLS. Classificar e proteger na exportação → sensitivity label.

SQL vs. KQL vs. DAX — a mesma pergunta, três dialetos

OperaçãoT-SQLKQLDAX
Filtrar linhasWHERE x > 5| where x > 5FILTER(T, T[x] > 5)
Selecionar colunasSELECT a, b| project a, bSELECTCOLUMNS(T, ...)
Agregar por grupoGROUP BY g| summarize sum(x) by gSUMMARIZECOLUMNS(g, "S", SUM(...))
Soma condicionalSUM(CASE WHEN…)summarize sumif(x, cond)CALCULATE(SUM(x), cond)
Top NSELECT TOP 10 … ORDER BY| top 10 by x descTOPN(10, T, T[x], DESC)
Contagem distintaCOUNT(DISTINCT x)dcount(x)DISTINCTCOUNT(x)
Juntar tabelasJOIN … ON| join kind=inner (…)relacionamento + RELATED
Total corridoSUM() OVER (ORDER BY)row_cumsum(x)CALCULATE(…, DATESYTD())

Um plano de estudos de quatro semanas

Semana 1
Fundamentos + Domínio 2AOneLake, taxonomia de itens, guia de decisão de stores e os storage modes. Depois obter dados: conexões, shortcuts, mirroring, Copy job. Construa um lakehouse e um warehouse na mão.
Semana 2
Domínio 2B + 2CTransformar: views/functions/procs, star schema, denormalização, limpeza. Depois consultar nos quatro dialetos — Visual Query Editor, SQL, KQL e DAX. Um exercício por dia em cada um.
Semana 3
Domínio 3Storage modes, star schema no modelo, relacionamentos, DAX (contexto de filtro, iteradores, windowing), calculation groups, Direct Lake e refresh incremental. Otimize um modelo real.
Semana 4
Domínio 1 + revisãoSegurança (RLS/CLS/OLS, OneLake roles, labels, endorsement), Git, deployment pipelines, .pbip, XMLA, impact analysis. Depois refaça o skills outline em voz alta.

A lista de prontidão

Marque cada item somente quando conseguir explicá-lo para outra pessoa sem consultar nada.

  • Domínio 1 · Manter uma solução de análise
  • Implementar controles de acesso no nível de workspace e de item (incl. Build permission)
  • Implementar RLS, CLS, OLS e acesso a arquivos (Warehouse, semantic model e OneLake roles)
  • Aplicar sensitivity labels e endossar itens (Promoted / Certified / Master data)
  • Configurar controle de versão (Git integration) e Power BI projects (.pbip)
  • Criar e configurar deployment pipelines, deployment rules e parameter rules
  • Fazer impact analysis de dependências downstream
  • Deployar e gerenciar semantic models pelo XMLA endpoint
  • Criar e atualizar assets reutilizáveis (.pbit, .pbids, shared semantic models)
  • Domínio 2 · Preparar dados
  • Criar conexões de dados e escolher o gateway certo
  • Descobrir dados com o OneLake catalog e o Real-Time hub
  • Escolher entre ingerir e acessar (shortcut vs mirror vs copy)
  • Escolher entre os data stores
  • Implementar integração OneLake para Eventhouse e semantic models
  • Criar views, functions e stored procedures
  • Implementar um star schema em lakehouse ou warehouse
  • Enriquecer, desnormalizar, agregar e juntar dados
  • Tratar duplicados, dados ausentes e nulos; converter tipos; filtrar
  • Consultar e agregar com Visual Query Editor, SQL, KQL e DAX
  • Domínio 3 · Implementar e gerenciar modelos semânticos
  • Escolher um storage mode (Import/DirectQuery/Direct Lake/Dual)
  • Implementar um star schema no modelo semântico
  • Implementar relacionamentos: bridge tables e many-to-many
  • Escrever DAX com variáveis, iteradores, table filtering, windowing e information functions
  • Implementar calculation groups, dynamic format strings e field parameters
  • Configurar large semantic model storage format e composite models
  • Melhorar performance de queries, visuais e DAX
  • Configurar Direct Lake (fallback e refresh) e escolher OneLake vs SQL endpoint
  • Implementar refresh incremental
Dois dias antes da prova

Pare de ler e comece a fazer. Numa trial capacity: carregue um CSV num lakehouse, modele um star schema pequeno num warehouse com MERGE, construa um semantic model em Direct Lake, escreva cinco medidas DAX (uma com CALCULATE, uma com SUMX, uma time-intelligence, uma windowing e uma via calculation group), configure RLS, conecte o workspace ao Git e promova tudo por um deployment pipeline de dois estágios. Tudo em que você tropeçar é o que precisa revisar.

Exam DP-600 · Skills measured as of 21 July 2026

Implementing Analytics Solutions Using Microsoft Fabric

A complete, objective-by-objective study guide built from Microsoft Learn. Every heading below maps to a bullet in the official skills outline, so you can walk the outline top to bottom and know nothing is missing.

Domain 1
25–30%
Maintain a data analytics solution
Domain 2
45–50%
Prepare data
Domain 3
25–30%
Implement and manage semantic models
Certification
Fabric Analytics Engineer Associate
Passing score
700 / 1000
Languages
SQL · KQL · DAX
Renewal
Free, yearly, online

How to use this guide

The three domains are not equally weighted. Prepare data alone is worth 45–50% of the exam — nearly half. That's where most of your time should go. The other two domains, governance/ALM and semantic models, split the remaining half evenly.

The exam is written for the analytics engineer: someone who designs lakehouses and warehouses, shapes data into a star schema, and builds high-performance semantic models. You're expected to query and transform data in four dialects — SQL, KQL, DAX and the Visual Query Editor (Power Query). Most questions aren't "what does this function do" — they're "given these constraints, which store, which storage mode, which modeling pattern do you pick, and why not the others".

A study order that works

Read Fabric fundamentals first — OneLake, the item taxonomy, the store decision guide and the four storage modes are the vocabulary every other answer is written in. Then work Domain 2 (the biggest, most hands-on), then Domain 3 (semantic models, Direct Lake and DAX), and finally Domain 1 (security and ALM), whose questions assume you already know what a lakehouse, a warehouse and a semantic model are.

The four question formats you'll meet

Format 1

Choose the right approach

"You need a 50 GB model refreshed every 15 min, no gateway. Which storage mode?" The answer is in a decision table. Eliminate by volume, data latency, storage mode and persona.

Format 2

Complete the code

Drag-and-drop or fill in T-SQL, KQL or DAX. The trap is usually a filter context in DAX (CALCULATE/FILTER), a wrong JOIN, or operator order in KQL.

Format 3

Diagnose the failure

A symptom plus the model. Why did Direct Lake fall back to DirectQuery? Why is the measure slow? Why does incremental refresh reload everything? Memorize the fallback and reload triggers.

Format 4

Order the steps

Sequence a Git connection, a deployment-pipeline promotion, or an RLS setup. Fabric has hard prerequisites — enable XMLA read-write before writing to the model, for instance.

Preview features can show up on the exam

Microsoft refreshes DP-600 roughly every six months, and preview features appear when they're commonly used. Wherever this guide marks something Preview, know what it is and what problem it solves — nobody will ask the GA date.

Fabric fundamentals (the vocabulary)

OneLake — the single copy

OneLake is the tenant's single logical data lake, auto-provisioned, with no infrastructure to create. Every data-bearing item writes Delta Parquet to OneLake, and that's what lets a single copy of the data be read by every engine — SQL, Spark, KQL and the Analysis Services behind Direct Lake — without duplication.

Level 1
TenantOne OneLake. Not optional, not removable.
Level 2
WorkspaceBehaves like a storage container.
Level 3
ItemLakehouse, Warehouse, Eventhouse… a folder.
Level 4
Tables / FilesManaged Delta tables vs. free-form files.
  • Delta Parquet is the native format for every workload. Warehouse, Lakehouse and Eventhouse all write Delta — the basis of "one copy".
  • External tools address OneLake as ADLS Gen2: https://onelake.dfs.fabric.microsoft.com/<workspace>/<item>/Tables/<table>.
  • Shortcuts point to data elsewhere (OneLake, ADLS, S3, GCS, Dataverse) without copying it; mirroring continuously replicates an external database into OneLake.

The item taxonomy an analytics engineer must recognize

Data Engineering

Lakehouse

Delta tables + files, Spark-first, with a read-only SQL analytics endpoint attached. Schema-on-read; supports named schemas.

Data Warehouse

Warehouse

Full read/write T-SQL, multi-table ACID transactions, schema-on-write. The only Fabric store with real DML and stored procedures.

Real-Time

Eventhouse · KQL Database

Time-series and log store, queried with KQL. Can expose its data in OneLake (OneLake availability) for other engines to read.

Power BI

Semantic model

The tabular (Analysis Services) model with tables, relationships and DAX measures. Import, DirectQuery or Direct Lake. The heart of Domain 3.

Power BI

Report · Dashboard · Paginated report

The consumption surfaces that connect to the semantic model — by live connection (Build permission) rather than importing data.

Data Factory

Dataflow Gen2 · Pipeline · Copy job

Transformation with Power Query; orchestration; and wizard-guided full/incremental replication.

Choosing a data store — the master decision table

This table answers a disproportionate share of Domain 2 questions.

StoreIdeal workloadPersona / skillWrite APIMulti-table transactions
LakehouseBig data, ML, un/semi-structured data, data engineeringData engineer, data scientist — SparkSpark (PySpark, Scala, Spark SQL, R), pipelines, DataflowsNo
WarehouseEnterprise DW, SQL-based BI, full transactionsDW developer, analytics engineer — T-SQLT-SQL DML, COPY INTO, CTAS, pipelines, DataflowsYes
Eventhouse / KQL DBStreaming, telemetry, logs, high-granularity analyticsApp developer, data engineer — KQLEventstream, SDKs, Kafka, .ingestNo
SQL database in FabricOperational OLTP inside FabricApp/DB developer — T-SQLT-SQL (full OLTP surface)Yes
Lakehouse or Warehouse for the star schema?

Both work. Pick the Warehouse if the team is T-SQL and you want full DML, stored procedures and MERGE for loading dimensions. Pick the Lakehouse if the team is Spark/Python and there's unstructured data. Both expose a SQL analytics endpoint and feed Direct Lake the same way.

Import, DirectQuery, Direct Lake and Dual

A table's storage mode decides where its data lives at query time. This is the most-tested distinction in Domain 3.

ModeWhere data livesQuery latencyRefreshUse when
ImportIn memory (VertiPaq), copied into the modelFastestScheduled/incremental refreshDefault; best performance; data fits in memory
DirectQueryStays at the source; query sent per visualSlowest (round-trip to source)Always liveHuge data or near-real-time; no copy
Direct LakeRead straight from Delta in OneLake, on demandNear ImportAutomatic reframing when Delta changesLarge OneLake volumes without Import's refresh cost
DualImport and DirectQuery; the engine decidesVariesBothDimensions in composite models, to avoid limit queries
Direct Lake is not DirectQuery

Direct Lake loads Delta columns straight into the tabular engine's memory (transcoding), so it has Import performance without importing. But it can fall back to DirectQuery when it exceeds a SKU guardrail or hits RLS on the SQL endpoint. Remember: Direct Lake = Import speed + near-real-time freshness, with a safety fallback.

Workspace roles — the essential matrix

Four roles govern everything in a workspace. Memorize who can share and who can only read (details and the security gotchas are in Domain 1).

CapabilityAdminMemberContributorViewer
Delete the workspace · manage access
Share items · add members
Create / edit items · write data
Read data (SQL endpoint · reports)

SQL, KQL and DAX — when to reach for each

T-SQL

Warehouse & SQL endpoint

Model and transform in batch, create views/functions/procs, load dimensions with MERGE. Set-based, schema-on-write.

KQL

Eventhouse

Explore logs and time series. A pipeline of operators (wheresummarizeproject), great for high-granularity telemetry.

DAX

Semantic model

Define measures and calculated columns over the tabular model. All final BI analysis runs through here — filter context is the key concept.

Domain 1 · 25–30% of the exam

Maintain a data analytics solution

This domain covers security, governance, and the development lifecycle in Microsoft Fabric. Master the access layers (workspace → item → OneLake → RLS/CLS/OLS), the ALM tooling (Git, deployment pipelines, .pbip, XMLA), and how to assess the impact of a change before you deploy it.

Skill 1.1Implement security and governance

The Fabric access-control layers

Fabric evaluates security in sequential layers. A user must pass every layer to reach the data. The order of operation is: 1) Microsoft Entra authentication, 2) Fabric access, 3) data security (table/file). Think of three grant scopes: the workspace (control plane), the item (individual share), and the data controls (OneLake, SQL, semantic model).

ScopeWhat it controlsHow it's grantedGranularity
Workspace roleAll items in the workspace (control plane)Admin/Member/Contributor/Viewer assigned to user or groupCoarse (whole workspace)
Item permissionA single Fabric item (share)Share item → Read (+ Reshare, Build, Write per item)Individual item
OneLake data-access roleFolders, files, and tables in OneLakeOneLake RBAC role (Read/ReadWrite) on the lakehouseFolder / file / table
RLS / CLS / OLSRows, columns, and objects inside a table/modelT-SQL in the Warehouse; DAX/Tabular in the semantic modelRow / column / object
The three security levels

Entra authentication → Fabric access → Data security. Each level is evaluated in sequence; failing any one blocks access. Sharing an item grants metadata and viewing, but does not grant access to the underlying data in SQL or OneLake — that requires additional compute or OneLake permission.

Workspace-level access controls

There are four workspace roles. They apply to all items in the workspace and don't leak to other workspaces, the capacity, or the tenant. A user with no role can't access the workspace at all.

CapabilityAdminMemberContributorViewer
Delete the workspace
Add admins
Add members
Share items / manage permissions
Write data / create items
Read data
Data Warehouse

Roles on the Warehouse

Admin, Member, and Contributor get CONTROL on each Warehouse and SQL analytics endpoint (full read/write + managing granular SQL permissions). Viewer gets CONNECT + ReadData.

Golden rule

Least privilege

Use Viewer for consumers, Contributor for developers, Member for people who must share, and reserve Admin for governance. Prefer security groups over individual users.

Viewer + Direct Lake

A Viewer who opens a Direct Lake report does not automatically see the data: they need OneLake data permission (DefaultReader/ReadData role) or the source must use a fixed identity. If RLS/CLS/OLS is defined on the SQL analytics endpoint, Direct Lake queries fall back to DirectQuery to honor the security.

Item-level access controls

Item permissions control access to one specific item, regardless of workspace roles. Sharing an item grants Read by default (view metadata and associated reports). Read does not grant access to the underlying data in SQL or OneLake — for that, grant additional compute permissions.

Item permissionWhat it enables
ReadView metadata and reports; default when sharing
ReshareShare the item with other users
Build (semantic model)Build new content on the data: create reports, Analyze in Excel, connect via XMLA, export underlying data
Write / EditModify the item; for a semantic model, equivalent to an Analysis Services database admin
ReadData / ReadAll (Lakehouse/Warehouse)Query the data via the SQL endpoint or OneLake
Build is the key to a semantic model

To connect via XMLA and browse a semantic model, a user needs Build permission — even if they are workspace Admin/Member/Contributor. RLS is honored, and they can't see the model's internal metadata.

Workspace vs item: the classic example

If you share a report with Marta, she reaches it via the link regardless of role. But if she is also a workspace Viewer, removing the item permission isn't enough: she still sees the report through the workspace. To fully block her, remove the item permission and the Viewer role.

Row, column, object & file-level security

Granular security lives in two independent engines: the Warehouse / SQL analytics endpoint (via T-SQL) and the semantic model (via Tabular/DAX). Separately, OneLake security enforces file/folder/table/row/column security in the lake itself.

ControlWhere it's definedMechanism
RLS (row)Warehouse/SQL endpoint · semantic model · OneLakeT-SQL SECURITY POLICY + predicate function · DAX role · OneLake role
CLS (column)Warehouse/SQL endpoint · OneLakeT-SQL GRANT/DENY per column · deny-list in OneLake role
OLS (object)Semantic modelTabular (Tabular Editor) hides model tables/columns
File / folderOneLakeOneLake Read/ReadWrite role over the path
T-SQL · RLS in the Warehouse
-- 1) Predicate function (inline TVF) with SCHEMABINDING
CREATE FUNCTION Security.tvf_securitypredicate(@SalesRep AS nvarchar(50))
    RETURNS TABLE WITH SCHEMABINDING
AS RETURN SELECT 1 AS result
WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'manager@contoso.com';
GO
-- 2) Policy that applies the filter to the table
CREATE SECURITY POLICY SalesFilter
ADD FILTER PREDICATE Security.tvf_securitypredicate(SalesRep)
ON sales.Orders WITH (STATE = ON);
T-SQL · CLS in the Warehouse
-- Charlie sees everything except the sensitive CreditCard column
GRANT SELECT ON Customers(CustomerID, FirstName, LastName, Phone, Email)
    TO [Charlie@contoso.com];
-- SELECT * now fails for Charlie:
-- Msg 230: The SELECT permission was denied on the column 'CreditCard'
T-SQL · OLS-like via DENY
-- Deny access to an entire column (deny-list)
DENY SELECT ON dbo.Payroll(Salary) TO [analysts];
-- For table/column OLS on the semantic model, use
-- Tabular Editor over the model (not T-SQL).
OneLake ReadWrite can't carry RLS/CLS

A OneLake security role with ReadWrite permission cannot contain RLS or CLS constraints. RLS/CLS only apply to Delta Parquet tables (or virtualized Iceberg); on other formats, the role blocks the whole table. Within a role, OLS ∩ RLS ∩ CLS (intersection); across roles, access combines by union (least restrictive).

OneLake: folder inheritance and traversal

Permission on a folder flows down to files and subfolders (inheritance). A user can list and traverse parent folders to reach the data they're allowed to see, without exposing sibling files. OneLake is deny-by-default: no role, no access. Role changes take ~5 min; group-membership changes, ~1 h.

Sensitivity labels

Sensitivity labels come from Microsoft Purview Information Protection and guard content against leakage and unauthorized access. Unlike RLS/CLS, the label travels with the data: it's inherited by downstream items and persists on export (Excel, PowerPoint, PDF), even outside Fabric.

Prerequisites

What you need

A Power BI Pro or PPU license and Edit permission on the item. If the label is greyed out, you don't have permission to use it.

Behavior

Downstream inheritance

Apply it from the header flyout or item settings. The label is inherited by reports/dashboards built on the labeled data and preserved on export.

Label ≠ permission

A sensitivity label classifies and (optionally) encrypts/protects data; it doesn't replace workspace roles or RLS. Combine them: labels for governance/DLP, RLS/CLS for who sees what. Note: labels are not supported in Power BI projects (.pbip).

Endorse items

Endorsement flags trustworthy content and surfaces it in search. There are three levels:

Promoted

Ready for reuse

The creator considers the item ready to share. Any item (except dashboards) can be promoted by any user with Write permission.

Certified

Organizational authority

An authorized reviewer attests the item meets quality standards. Only users designated by the Fabric admin (delegable to domain admins) can certify.

Master data

Single source of truth

Marks core data (product codes, customer lists). Only for items that contain data (lakehouses, semantic models) and only users designated by the admin.

Admin enablement

Promoted is always available. Certified and Master data must be enabled by the Fabric admin. Power BI dashboards can't be endorsed at all.

Skill 1.2Maintain the development lifecycle

Version control (Git integration)

Git integration connects a workspace to a repository branch so you can version, revert, and collaborate. The integration is at the workspace level and preserves the subfolder structure in Git.

1
ConnectConnect the workspace to a provider + repo + branch
2
CommitPush workspace changes to the branch
3
UpdatePull branch changes into the workspace
4
ResolveHandle conflicts when both sides changed
Providers

Supported

Azure DevOps, GitHub, and GitHub Enterprise — all cloud-only. Unsupported items in the workspace are ignored (not synced, but not deleted either).

Permissions

Both sides

What you can do depends on your permissions in the workspace and in the Git repo. You need write access to the branch to commit.

Sync status

Each item shows a status: Synced, Uncommitted (changed in the workspace), Update required (changed in Git), or Conflict (changed in both). Conflicts must be resolved manually before syncing.

Power BI Desktop projects (.pbip)

Preview Saving as a Power BI Project (.pbip) writes the report and semantic model as plain-text files in separate folders — ideal for Git, diff, and collaboration. Enable it under File > Options > Preview features.

Structure · .pbip folder
Project/
├── AdventureWorks.Report/       -- definition.pbir (PBIR)
├── AdventureWorks.SemanticModel/ -- definition.pbism + TMDL
├── .gitignore                   -- ignores cache.abf, localSettings
└── AdventureWorks.pbip          -- pointer to the Report folder
TMDL

Model metadata

The semantic model is serialized to TMDL (human-readable text), editable in VS Code or Tabular Editor via TOM. Clean per-object diffs make merge and code review easy.

PBIR

Report format

The report uses the enhanced PBIR format (definition.pbir), letting you reuse pages and version individual visuals.

.pbix vs .pbip in Git

A .pbix is a binary: Git versions it only as an opaque blob (no diff, no merge of pages/measures). A .pbip is text: you see exactly what changed and can merge. Convert .pbix ⇄ .pbip only via Desktop's Save as (not programmatically). Sensitivity labels are not supported in .pbip.

Deployment pipelines

Deployment pipelines promote content between stages (typically Dev → Test → Prod). Git handles version control; pipelines handle promotion across environments.

Dev
DevelopmentBuild and develop
Test
TestTest at real volume
Prod
ProductionPublish to the business
Stages

2 to 10

From 2 to 10 stages; the default is 3. You can add, remove, and rename them. Each stage is backed by a workspace.

Pairing

Item pairing

Items are paired across adjacent stages; only paired items get overwritten on deploy. Unpaired items create a duplicate copy. Pairing survives renaming.

RuleWhat it does
Deployment ruleOverrides the data source in the target stage (e.g., Dev points to a test DB, Prod to the production DB)
Parameter ruleSets stage-specific parameter values
AutobindingAutomatically rebinds references (e.g., report → semantic model) to the paired item in the target stage
Preview and retirements

Preview The new deployment pipelines UI and several items (Report, Semantic model, Dashboard, Paginated report, Dataflow, etc.) are in preview. From Feb 12, 2026, semantic models without Enhanced Metadata are no longer supported in pipelines. Automate via REST APIs.

Impact analysis of dependencies

Before changing an item, assess what breaks downstream. The lineage view shows connections within the workspace (plus external sources one level up); impact analysis shows downstream dependents, including in other workspaces.

ToolScopeTypical use
Lineage viewWorkspace items + external sources 1 level upstream"Where does this report's data come from?"
Impact analysisDownstream dependents (even in other workspaces)"What breaks if I change this lakehouse/warehouse/dataflow/semantic model?"
Notify contacts

In impact analysis you can notify the contacts of impacted items before a disruptive change. Downstream items in other workspaces do not appear in the lineage view — only in impact analysis. Viewers don't see data sources in lineage.

XMLA endpoint

The XMLA endpoint exposes the semantic model as if it were an Analysis Services server, for external tools. It is read-only by default (querying); write operations require read-write.

ToolRead-only (query)Read-write (metadata)
Excel / Report Builder / DAX Studio
SSMS (TMSL, fine-grained refresh)
Tabular Editor (model/OLS editing)
ALM Toolkit (schema compare/deploy)
Visual Studio (SSDT)
Read-write needs TWO things

To write via XMLA you need: 1) a Premium / PPU / Fabric capacity; 2) the XMLA Endpoint = Read Write property on the capacity (applies to all its workspaces); and 3) the tenant setting "Allow XMLA endpoints and Analyze in Excel" enabled. Also: an XMLA write on a Desktop-authored model prevents downloading it back as .pbix — keep the original. Build permission is required for any XMLA access.

Read-write use cases

Fine-grained incremental refresh of specific partitions (no 48/day limit), deploying models from Visual Studio, TMSL scripts, managing RLS/OLS, and schema compare with ALM Toolkit. Models live-connected to AAS/SSAS/another workspace and push datasets do not appear via XMLA.

Reusable assets

Cut rework by reusing templates and standardized data sources, and by connecting to shared models instead of duplicating them.

.pbit

Report template

A Power BI template with structure, measures, and visuals but no data. On open it prompts for parameters/credentials and loads. Standardizes new-report creation.

.pbids

Data source

A file describing a pre-configured data source. It opens Desktop straight into the Get Data dialog pointed at the source — fast, consistent onboarding.

Shared semantic model

Live connection

Live-connect to a published semantic model (single source of truth) via Build permission, instead of importing data. One model, many reports.

.pbip as a template

Because .pbip splits report and model into text folders, it also works as a development template: copy semantic-model tables between projects or reuse report pages. Prefer shared models over importing the same data N times.

Domain 2 · 45–50% of the exam

Prepare data

This is the largest DP-600 domain — on its own it is worth nearly half the exam. It covers the full data lifecycle in Fabric: get (connections, gateways, catalog, shortcuts, mirroring, copy, data store choice), transform (T-SQL, PySpark and Power Query; star schema; cleansing) and query (Visual Query Editor, SQL, KQL and DAX). Study for decisions: for each scenario, know which tool to pick and why. Master the decision tables — shortcut vs mirror vs copy, and Lakehouse vs Warehouse vs Eventhouse vs SQL database — because the exam loves these trade-offs.

Skill 2.1 Get data

Data connections & gateways

A connection encapsulates the source address, authentication kind and credentials. In Fabric you manage everything centrally at Settings → Manage connections and gateways. The decision question is always: where does the source live and how can Fabric reach it? The answer decides whether you need only a cloud connection or a gateway to bridge into the network where the data lives.

TypeWhen to useWhere the source livesInstalls software?
Cloud connectionSaaS/PaaS source reachable over the public internet (Azure SQL, ADLS Gen2, S3, Snowflake)Cloud, public endpoint✔ No — native
On-premises data gateway (OPDG)Source in your datacenter/local network, behind the corporate firewallOn-premisesYes — install on a local-network host
VNet data gatewaySource in an Azure Virtual Network, behind private endpoint/firewallPrivate Azure VNet✔ No — Microsoft-managed
Cloud

Cloud connection

Shareable across items. A security flag decides whether a gateway may reuse it. ADLS/S3 shortcuts delegate authorization via a cloud connection.

On-prem

OPDG

Bridge to local data. Also enables on-premises shortcuts to network-restricted paths. Installed on a local-network VM you maintain.

Private

VNet gateway

No VM to maintain: Microsoft provisions the gateway inside your VNet to reach private resources behind private endpoints.

Credential / authentication kinds. When you create the connection you choose how Fabric authenticates to the source. The available option depends on the connector. For automation, prefer service principal or Managed Identity over embedded passwords.

CredentialDescriptionTypical use
BasicSource username and passwordLegacy SQL/ODBC databases
OAuth 2.0 / organizational accountMicrosoft Entra ID identity; supports SSO in compatible scenariosMicrosoft and modern SaaS sources
Service principalApp identity (tenant/client id + secret) for unattended automationPipelines, CI/CD, unattended ingestion
Account key / SASStorage account key or scoped/time-limited SAS tokenAzure Blob, ADLS Gen2
AnonymousNo credential — public endpointOpen APIs/files
KeyAPI key or access key of the sourceS3, some web connectors

Connection sharing & roles. A connection is a governable object: you grant roles to other users — Owner (manage and use), User (use in items) and User with sharing (use and re-share). A team thus reuses a single connection without redistributing credentials.

When a gateway is (and isn't) required

You need a gateway when the source is behind a firewall/private network: on-premises database → OPDG; VNet resource with a private endpoint → VNet gateway. You do not need a gateway for public-endpoint sources (public Azure SQL, ADLS Gen2, S3, Snowflake) — a cloud connection is enough.

Direct Lake uses no gateway

Direct Lake semantic models (on OneLake or on SQL) support cloud connections only — they cannot operate through any on-premises or VNet gateway. If the source requires a gateway, the model must fall back to Import or DirectQuery; Direct Lake is no longer an option.

OneLake catalog & Real-Time hub

These are Fabric's two discovery entry points. Rule of thumb: analytical data at rest → OneLake catalog; data in motion / streaming → Real-Time hub. Knowing which one to use is often the whole exam question.

At rest

OneLake catalog

Central hub to find, explore, secure and govern Fabric items. The Explore tab lists items (filterable by workspace, domain and type), opens an in-context details pane and allows ad-hoc data exploration. The Govern tab gives insights and recommended governance actions for items you created.

In motion

Real-Time hub

Single place to discover and connect to streaming and event sources — Fabric events, Azure events (Event Hubs, Blob), streams. You preview, subscribe and route events to Eventhouse, Lakehouse, Activator and other destinations.

What it discoversOneLake catalogReal-Time hub
Nature of the dataAt rest (Delta, tables, files)In motion (streams, events)
Items listedLakehouses, Warehouses, semantic models, KQL DBs, reportsEventstreams, Fabric events, Azure events
FocusGovernance, endorsement, ad-hoc explorationConnect, preview and route events
Typical actionExplore data, view lineage, apply labelsCreate eventstream, subscribe to a stream

Ingest or access data

The domain's master decision. Copy physically moves data into OneLake; a shortcut points to data in place (virtual, zero copy); mirroring replicates an operational database continuously into OneLake via CDC. If you memorize a single table from this guide, memorize this one.

CriterionShortcutMirroringCopy (job / activity)
Data movementNone — virtual referenceContinuous replica (CDC) into OneLakePhysical copy, on-demand/scheduled
Data stays where?At the source (in-place)Read-only copy in OneLake (Delta)In OneLake, Fabric-managed
CostNo storage duplication✔ Free compute; free storage up to the included limitConsumes pipeline compute
Transform on the wayNoNo (replica only)✔ Yes (mapping, schema, upsert)
Syncs with source✔ Automatic (schema too)✔ Continuous (near real-time, seconds to minutes)Only on re-run
LatencyInstant (reads the source)Low (~seconds under good conditions)Depends on schedule/size
Best forAvoid copy; single source of truth; bronze/fast onboardingOperational DB (Azure SQL, PostgreSQL, Cosmos DB) → gold analyticsMetadata-driven ELT/ETL, orchestration, migration
Proprietary format → mirroring

Shortcuts in Tables require a supported table format (Delta). If the source is an operational database in a proprietary format and you want the whole database with no ingestion design, mirroring is the option. A shortcut references data already in a lake; a mirror is a CDC replica of a database.

Mirroring — supported databases and traits

Mirroring replicates an operational database into OneLake as Delta tables, with no ETL to build. The replication compute is free and each capacity unit includes a free mirroring storage quota (about 1 TB per CU). Latency is near real-time — typically seconds to a few minutes, depending on change volume.

ModeWhat it replicatesSources
Database mirroringData and metadata, written as Delta in OneLake via CDCAzure SQL DB, Azure SQL MI, SQL Server, Azure Cosmos DB, Azure Database for PostgreSQL, Snowflake, Fabric SQL DB
Metadata mirroringOnly the catalog structure — data is accessed through shortcutsAzure Databricks (Unity Catalog)
Open mirroringYou push change data to a landing zone via a public APIAny custom or ISV application
  • Creates two artifacts in the workspace: the replication process and a read-only SQL analytics endpoint over the Delta copy.
  • Requires a running Fabric capacity — pausing the capacity stops replication.
  • It is the right route when the source is a transactional database you want to analyze continuously and cheaply, without building a pipeline.

Shortcut types

You create shortcuts in lakehouses and KQL databases. They appear as folders and behave like symbolic links — deleting the shortcut doesn't affect the target, but deleting content inside the shortcut deletes it at the source if you have permission there.

CategorySupported targets
Internal (OneLake)Lakehouses, Warehouses, KQL databases, SQL databases, Mirrored Databases, Mirrored Azure Databricks Catalogs, Semantic models
ExternalADLS Gen2, Azure Blob, Amazon S3 (and S3-compatible), Google Cloud Storage, Dataverse, Iceberg, OneDrive/SharePoint
On-premisesNetwork-restricted paths via on-premises data gateway (OPDG)
Shortcuts in the Tables vs Files folder

In the Tables folder you can only create shortcuts at the top level, and the target must be Delta to be recognized as a table and appear in the SQL endpoint. In the Files folder there is no level or format restriction. Shortcut caching (1–28 days) cuts cross-cloud egress cost for S3, GCS and OPDG.

Copy tools — which to use

Copy job

Ingestion without pipelines

Native bulk (full), incremental (watermark) and CDC, no pipeline to build. More control than mirroring, less complexity than Copy activity. Ideal for bronze raw from varied sources.

Copy activity

Inside a pipeline

Fully customizable: user-defined query, parameterization, staging, multiple destinations, orchestration with dependencies. For complex metadata-driven ELT.

Dataflow Gen2

Power Query at scale

Low-code transformation with the Power Query engine, configurable destination (Lakehouse/Warehouse). Great for self-service and visual cleansing before writing.

Eventstream

Streaming

Real-time ingestion/transformation, no-code, routing to Eventhouse, Lakehouse and Activator. For high-frequency data and events.

Copy job modeWhat it doesWhen to use
FullCopies the whole dataset each runSmall tables or first load
Incremental (watermark)Copies only new/changed rows by a watermark column (date, id)Large tables that only grow/change by key
CDCApplies inserts/updates/deletes captured at the sourceSource with change tracking and a need for deletes
PySpark · read a shortcut as a native table
# A shortcut under Tables/ behaves like a local Delta table
df = spark.read.format("delta").load("Tables/sales_s3")
df = spark.sql("SELECT * FROM MyLakehouse.sales_s3 LIMIT 1000")

Choose between data stores

Four questions settle almost any scenario: (1) High-volume telemetry/real-time? (2) Do you develop in Spark or T-SQL? (3) Need multi-table transactions and DML? (4) App operational OLTP? Answer in that order and the item settles itself.

1
Streaming / telemetry?Yes → Eventhouse (KQL)
2
Develop in Spark?Yes → Lakehouse
3
Multi-table / T-SQL DML?Yes → Warehouse
4
Operational OLTP?Yes → SQL database
FactorLakehouseWarehouseEventhouseSQL database
Persona / interfaceData engineer / scientist — SparkSQL developer — T-SQLReal-time analyst — KQLApp dev — T-SQL OLTP
Primary languagePySpark, Spark SQLT-SQLKQLT-SQL
Data typeStructured + unstructuredStructuredSemi-structured, time series, logsStructured operational
Write / DMLSpark; SQL endpoint is read-only✔ Full T-SQL DML/DDLIngestion via stream/queued✔ Transactional OLTP
Multi-table transactionsNo (per-Delta-table guarantee)✔ YesNo✔ Yes
LatencyBatchBatch / interactive✔ Sub-second on time seriesLow-latency OLTP
Storage formatDelta (OneLake)Delta (OneLake)Kusto engine; Delta via OneLake availabilityDelta mirrored to OneLake
Typical use caseMedallion, ML, heterogeneous dataEnterprise data warehouse, BILarge-scale operational reporting, IoTSmall/medium operational reporting
Lakehouse SQL analytics endpoint

Every Lakehouse automatically exposes a SQL analytics endpoint: read-only T-SQL over the Delta tables and over folders referenced by shortcuts. It supports full DQL and limited DDL (views and table-valued functions) but no DML. To write with T-SQL you need a Warehouse. This Lakehouse-endpoint (read-only) vs Warehouse (read+write) distinction is a top trap.

OneLake integration (Eventhouse & semantic models)

Fabric's principle is one logical copy: data lives as Delta in OneLake and every engine reads the same file. Three integrations show up heavily on the exam: Eventhouse OneLake availability, Direct Lake reading OneLake, and a KQL shortcut to OneLake.

Eventhouse

OneLake availability

When you turn on OneLake availability on a KQL database (or table), the Eventhouse creates a logical copy in Delta Lake in OneLake. Spark, Warehouse, Lakehouse, notebooks and Direct Lake can then read the KQL data. The OneLake copy is read-only and cannot be optimized after creation. It can be enabled at the database level (applies to new tables and optionally existing ones) or at the table level.

Semantic model

Direct Lake reads OneLake

Direct Lake loads Delta tables from OneLake straight into memory (VertiPaq), with no import and no DirectQuery. A refresh only re-maps metadata (framing) — it takes seconds. Columns are paged in on demand (on-demand transcoding).

KQL shortcut to OneLake. In a KQL database you create a shortcut pointing to Delta tables in OneLake and query them as an external table. It is the reverse direction: instead of exposing KQL to the lake, you bring lake data into the Kusto engine without copying it.

KQL · query a shortcut to OneLake
external_table('sales_gold')
| where Region == "South"
| take 100
AspectDirect Lake on OneLakeDirect Lake on SQL endpoint
SourceAny Fabric item with Delta tablesOnly lakehouse/warehouse (tables or views)
DirectQuery fallbackDoes not fall back✔ Falls back (e.g. SQL view, RLS)
Composite model✔ Combines with ImportNo
SQL endpoint RLSNot applied (uses OneLake file access)✔ Applied (via fallback)
Direct Lake needs Delta

Direct Lake only works over data in Delta in OneLake. Complex types, Binary and GUID are unsupported (convert to string). It requires a Fabric capacity (F SKU) and a workspace in the same region as the source. Exceeding the SKU's row/memory limits makes the model fall back to DirectQuery (on SQL endpoint only) or fail (on OneLake).

Skill 2.2 Transform data

Views, functions & stored procedures

In the Warehouse you get full T-SQL (DQL + DML + DDL). Use views to encapsulate read logic, functions for reusable logic (scalar and inline TVFs) and stored procedures for transformation pipelines with DML. On the Lakehouse SQL analytics endpoint the surface is read-only: only views and TVFs, no procedures with DML.

ObjectFor whatWarehouseLakehouse SQL endpoint
VIEWEncapsulate a reusable query
Inline TVFParameterized view (returns a table)
Scalar functionCalculation returning a value
PROCEDURE (DML)Load/transform with INSERT/UPDATE/MERGENo (read-only)
T-SQL · CREATE VIEW
CREATE VIEW dbo.vw_sales_gold AS
SELECT d.year, d.month, p.category,
       SUM(f.amount) AS total
FROM dbo.fact_sales f
JOIN dbo.dim_date d    ON f.date_key = d.date_key
JOIN dbo.dim_product p ON f.prod_key = p.prod_key
GROUP BY d.year, d.month, p.category;
T-SQL · CREATE FUNCTION (inline TVF)
CREATE FUNCTION dbo.fn_sales_by_year (@year INT)
RETURNS TABLE AS
RETURN (
  SELECT p.category, SUM(f.amount) AS total
  FROM dbo.fact_sales f
  JOIN dbo.dim_date d ON f.date_key = d.date_key
  JOIN dbo.dim_product p ON f.prod_key = p.prod_key
  WHERE d.year = @year
  GROUP BY p.category
);
T-SQL · CREATE PROCEDURE (Warehouse only)
CREATE PROCEDURE dbo.sp_load_gold AS
BEGIN
  TRUNCATE TABLE dbo.agg_sales_month;

  INSERT INTO dbo.agg_sales_month (year, month, total)
  SELECT d.year, d.month, SUM(f.amount)
  FROM dbo.fact_sales f
  JOIN dbo.dim_date d ON f.date_key = d.date_key
  GROUP BY d.year, d.month;
END;

Enrich. Add derived (computed) columns or tables that layer in business context — margin, age band, churn flag — before BI consumption. The operation exists in all three dialects.

PySpark

withColumn

df.withColumn("margin", col("price")-col("cost"))

T-SQL

Computed column

ALTER TABLE ... ADD margin AS (price-cost)

Power Query

Custom column

Add column → M formula [price]-[cost]

Implement a star schema

The star schema is the preferred structure for analytical modeling: a central fact table (measurable events — sales, clicks, visits) surrounded by dimension tables (descriptive context — product, customer, date). It applies to both the lakehouse and the warehouse. Each fact uses surrogate keys (generated substitute keys) to point at dimensions, insulating the model from the source's natural keys.

ElementFactDimension
ContentNumeric measures + foreign keysDescriptive attributes + surrogate key
GrainOne row per eventOne row per member
CardinalityMany rows ("many" side)Few rows ("one" side)
KeySurrogate FK to each dimensionSurrogate key (PK) + business key
Examplesfact_sales, fact_visitsdim_product, dim_customer, dim_date

Slowly Changing Dimensions (SCD). Manage change of dimension attributes over time.

TypeBehaviorHistory
Type 1Overwrites the old valueNone
Type 2New row with surrogate key, StartDate/EndDate and IsCurrent✔ Full (versioned)
Type 3Extra column holding the previous valueLimited (only the immediately previous version)
1
Detect changeCompare source vs current dimension
2
Expire old versionEndDate = today, IsCurrent = 0
3
Insert new versionNew surrogate key, IsCurrent = 1
4
Fact points to versionFK uses the surrogate key valid at the date
Inferred member

When a fact arrives before its dimension (the key exists in the fact but not in the dimension), you insert an inferred member: a placeholder dimension row with the business key and null/unknown attributes, so you don't lose the fact. The dimension process later fills in the real attributes.

T-SQL · MERGE (dimension upsert, SCD Type 1)
MERGE dbo.dim_customer AS tgt
USING staging.customer AS src
   ON tgt.customer_id = src.customer_id
WHEN MATCHED THEN UPDATE SET
   tgt.email = src.email, tgt.city = src.city
WHEN NOT MATCHED THEN
   INSERT (customer_id, email, city)
   VALUES (src.customer_id, src.email, src.city);
PySpark · dimension with surrogate key
dim = (spark.table("staging.customer")
  .dropDuplicates(["customer_id"])
  .withColumn("customer_key",
      monotonically_increasing_id()))
dim.write.format("delta") \
   .mode("overwrite") \
   .saveAsTable("gold.dim_customer")

Denormalize & aggregate

Denormalize = flatten related tables into one, cutting query-time joins (trade storage for read speed). Aggregate = pre-sum at a coarser grain to speed up dashboards. The same aggregation operation, side by side across the three dialects:

PySpark · groupBy + agg
from pyspark.sql import functions as F
agg = (df.groupBy("year", "month", "category")
         .agg(F.sum("amount").alias("total"),
              F.countDistinct("customer_id").alias("customers")))
agg.write.mode("overwrite").saveAsTable("gold.agg_sales")
T-SQL · GROUP BY
SELECT year, month, category,
       SUM(amount) AS total,
       COUNT(DISTINCT customer_id) AS customers
FROM dbo.fact_sales f
JOIN dbo.dim_date d ON f.date_key = d.date_key
GROUP BY year, month, category;
Power Query (M) · group
let
  Source = fact_sales,
  Grouped = Table.Group(Source,
    { "year", "month", "category" },
    { { "total", each List.Sum([amount]), type number } })
in
  Grouped
Denormalizing isn't always good

A flattened table speeds reads but inflates storage and complicates maintenance (a dimension attribute that changes must be rewritten on every row). The star schema denormalizes within dimensions but keeps fact and dimension separate — the balance the exam expects.

Merge & join

Combine tables by key. Watch the join type (inner drops non-matches; left keeps the left side) and fan-out (joining a duplicated dimension inflates the fact).

TypeReturnsPySparkT-SQL
InnerOnly matches on both sides"inner"INNER JOIN
Left (outer)All of the left + matching right"left"LEFT JOIN
Right (outer)All of the right + matching left"right"RIGHT JOIN
Full (outer)Everything from both sides"full"FULL JOIN
Left antiLeft rows with no match (what's missing)"left_anti"WHERE NOT EXISTS
Left semiLeft rows that have a match (no right columns)"left_semi"WHERE EXISTS
GoalPySparkT-SQLPower Query
Enrich fact with dimensiondf1.join(df2, "key", "left")LEFT JOIN dim ON f.k = dim.kMerge Queries → Left Outer
Matches onlyjoin(df2, "key", "inner")INNER JOINInner Join
Anti-join (what's missing)join(df2, "key", "left_anti")WHERE NOT EXISTS (...)Left Anti Join
PySpark · chained join
sales_enr = (fact
  .join(dim_product, "prod_key", "left")
  .join(dim_customer, "customer_key", "left")
  .select("date_key", "category",
          "segment", "amount"))
Broadcast join

In Spark, when one side of the join is small (a dimension), use broadcast to ship that table to every executor and avoid a shuffle — much faster. fact.join(F.broadcast(dim), "k", "left"). A big fact against a small dimension is the classic scenario.

Duplicates, missing & nulls

Cleansing is mandatory before the star schema. Identify duplicates by business key, decide the null policy (remove, impute or flag) and document it. Each operation across the three dialects:

ProblemPySparkT-SQLPower Query
DuplicatesdropDuplicates(["k"])ROW_NUMBER() OVER(PARTITION BY k)=1Table.Distinct / Remove Duplicates
Impute nullfillna({"v":0})ISNULL(v,0) / COALESCE(v,0)Table.ReplaceValue / Replace Values
Filter nullfilter(col("x").isNotNull())WHERE x IS NOT NULLRemove Blank Rows
PySpark · dedup + nulls
clean = (raw
  .dropDuplicates(["order_id"])
  .fillna({"discount": 0, "channel": "unknown"})
  .filter(F.col("customer_id").isNotNull()))
T-SQL · dedup via ROW_NUMBER (keep latest)
WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (
    PARTITION BY order_id
    ORDER BY updated_at DESC) AS rn
  FROM staging.orders
)
SELECT * FROM ranked WHERE rn = 1;
Power Query (M) · remove duplicates and impute
let
  Source = staging_orders,
  NoDup = Table.Distinct(Source, { "order_id" }),
  Impute = Table.ReplaceValue(NoDup,
    null, 0, Replacer.ReplaceValue, { "discount" })
in
  Impute

Convert types & filter

Correct types avoid aggregation errors and improve compression. Convert in the silver layer, and filter early (predicate pushdown) to cut volume before expensive transforms. Prefer TRY_CAST/TRY_CONVERT for conversions that may fail — they return NULL instead of breaking the query.

OperationPySparkT-SQLPower Query
Convert typecol("v").cast("decimal(18,2)")CAST(v AS DECIMAL(18,2))Table.TransformColumnTypes
Safe conversioncast(...) returns null on failureTRY_CAST / TRY_CONVERTChange Type with Locale
Filter rowsfilter(col("year")=2026)WHERE year = 2026Table.SelectRows
Date from stringto_date(col("d"),"yyyy-MM-dd")TRY_CONVERT(DATE, d)Type → Date
ConceptPySpark / Spark SQLT-SQL (Warehouse)
IntegerIntegerType / LongTypeINT / BIGINT
DecimalDecimalType(p,s)DECIMAL(p,s)
TextStringTypeVARCHAR(n)
Date / timeDateType / TimestampTypeDATE / DATETIME2
BooleanBooleanTypeBIT
PySpark · cast + filter (early filter)
silver = (bronze
  .filter(F.col("amount").isNotNull())
  .withColumn("amount", F.col("amount").cast("decimal(18,2)"))
  .withColumn("date", F.to_date("date_str", "yyyy-MM-dd"))
  .filter(F.col("amount") > 0))

Skill 2.3 Query and analyze data

Four languages, four contexts. Know which to use where: Visual Query Editor (no-code over lakehouse/warehouse), SQL (endpoint/warehouse), KQL (Eventhouse) and DAX (semantic model). Choosing the right language for the right source is exactly what the exam tests.

Visual Query Editor

A no-code editor based on the Power Query diagram. You drag operations (select columns, filter rows, group, merge) and Fabric generates the M/SQL behind the scenes. Available on the Lakehouse SQL analytics endpoint and the Warehouse. Ideal for select/filter/aggregate without writing code, and you can save the result as a view directly.

No-code

Visual Query

Power Query diagram. Drag transformations; great for prototyping and for those who don't know SQL. A Save as view button materializes the query.

Code

SQL Query editor

Hand-written T-SQL on the same endpoint. Fine control, window functions, CTEs. Use it when the visual can't express the logic.

Visual vs SQL query editor

The same endpoint offers the Visual Query Editor (Power Query diagram, no-code) and the SQL Query editor (hand-written T-SQL). Use the visual one to prototype; refine in SQL when you need fine control. Either can become a view.

SQL

T-SQL via the SQL analytics endpoint (read over lakehouse) or directly on the Warehouse (read and write). It is the default query language for tabular Delta data. Master WHERE, GROUP BY, HAVING and window functions (ROW_NUMBER, RANK, SUM() OVER).

T-SQL · select/filter/group/having
SELECT p.category,
       COUNT(*) AS orders,
       SUM(f.amount) AS revenue
FROM dbo.fact_sales f
JOIN dbo.dim_product p ON f.prod_key = p.prod_key
JOIN dbo.dim_date d    ON f.date_key = d.date_key
WHERE d.year = 2026
GROUP BY p.category
HAVING SUM(f.amount) > 10000
ORDER BY revenue DESC;
T-SQL · window function (ranking within category)
SELECT category, product, revenue,
       RANK() OVER (
         PARTITION BY category
         ORDER BY revenue DESC) AS position
FROM dbo.vw_revenue_product;

KQL

Kusto Query Language in a KQL queryset over the Eventhouse. Read-only and optimized for time series and logs. Key operators: where (filter), project (select columns), summarize (aggregate by), extend (computed column), join (combine tables), top (N largest), take (sample).

KQL operatorSQL equivalentDoes
whereWHEREFilters rows
projectSELECT (columns)Picks/renames columns
extendSELECT expr AS colCreates a computed column
summarizeGROUP BY + aggAggregates by key
topORDER BY + TOPN largest by expression
KQL · where / summarize / extend / project / top
Sales
| where Timestamp > ago(30d)
| where Category == "Electronics"
| summarize Revenue = sum(Amount),
            Orders = count()
    by bin(Timestamp, 1d), Region
| extend Ticket = Revenue / Orders
| project Timestamp, Region, Revenue, Ticket
| top 100 by Revenue desc
KQL · join between two tables
Sales
| join kind=inner (
    Products | project ProdId, Category
  ) on ProdId
| summarize Revenue = sum(Amount) by Category

DAX

The DAX query view in Power BI runs DAX queries over the semantic model. Every query starts with EVALUATE returning a table. SUMMARIZECOLUMNS groups and aggregates — the standard way to inspect measures without building a visual. TOPN cuts the N largest; FILTER applies predicates.

DAX · EVALUATE + SUMMARIZECOLUMNS + FILTER
EVALUATE
SUMMARIZECOLUMNS (
    dim_product[category],
    dim_date[year],
    FILTER ( dim_date, dim_date[year] = 2026 ),
    "Revenue", SUM ( fact_sales[amount] ),
    "Orders", COUNTROWS ( fact_sales )
)
ORDER BY [Revenue] DESC
DAX · TOPN (5 categories by revenue)
EVALUATE
TOPN (
    5,
    SUMMARIZECOLUMNS (
        dim_product[category],
        "Revenue", SUM ( fact_sales[amount] )
    ),
    [Revenue], DESC
)
One language per context

SQL → tabular Delta data (lakehouse/warehouse). KQL → telemetry/logs in the Eventhouse. DAX → measures and relationships in the semantic model. Visual Query Editor → same as SQL, but without writing code. Choosing the right language for the right source is exactly what the exam tests.

Domain 3 · 25–30% of the exam

Implement and manage semantic models

The largest domain on the exam. You design the model (storage mode, star schema, relationships, DAX, calculation groups) and then optimize it at scale (Performance Analyzer, DAX Studio/VertiPaq, Direct Lake, incremental refresh). Decide each table's storage mode first — it governs performance, data freshness, and capacity limits. Skills measured 2026-07-21; preview features are marked.

Skill 3.1Design and build semantic models

Choose a storage mode

Storage mode is a per-table property. A model mixing modes is a composite model. Import and Direct Lake are processed by the VertiPaq engine (in-memory); DirectQuery translates DAX to the source's native language (SQL) and federates the query.

CriterionImportDirectQueryDirect LakeDual
Query engineVertiPaq (memory)Federated to sourceVertiPaq (memory)VertiPaq or source
Data copy✔ full snapshot— (reads Delta on-demand)caches when useful
Data freshnessas of last refreshreal timelast framingdepends
Typical performanceFastSlowerFast (~Import)Optimizes joins
SourceAny connectorDQ-capable connectorDelta in OneLakeImport+DQ source
LicenseAny (incl. Free)Any (incl. Free)Fabric capacity only (F/P SKU)Any
Ideal useSelf-service, mid dataVolatile source, no cacheGold layer, large volumesDimensions in composite
Quick decision

Large volumes in OneLake, IT-driven lake-centric project → Direct Lake. Self-service analyst needing Power Query and agility → Import. Source that must reflect real time with no cache → DirectQuery. Dimensions serving both Import and DirectQuery tables in one model → Dual.

Mode change is limited

You can only change storage mode if the table was created in DirectQuery or Direct Lake on OneLake. DirectQuery → Import or Dual (no way back). Direct Lake on OneLake → Import via semantic link labs in Fabric notebooks.

Star schema in the model

The star schema is the foundation: fact tables (transactional metrics, many rows) at the center, linked to dimension tables (descriptive attributes, few rows) by one-to-many relationships. Prefer star over snowflake — fewer joins, simpler filters, more predictable DAX.

Fact

Single grain

One row per event at the defined grain. Store foreign keys + additive numeric values. Mark the date table as a date table for time intelligence.

Dimension

Denormalize

Collapse snowflake hierarchies into a single dimension. The one-side column must be unique — Direct Lake fails the query on duplicates.

Keys

Surrogate

Use narrow integer keys. In Direct Lake, related data types must match; binary/GUID are unsupported — convert to string.

Relationships, bridges & many-to-many

Every relationship has cardinality (1:*, 1:1, *:*), cross-filter direction (single/both), and active/inactive state. Only one active relationship can exist between two tables; the rest are inactive and activated on demand with USERELATIONSHIP inside CALCULATE.

Cross-filterSingle (recommended)Both (bidirectional)
Filter directionDimension → factBoth sides
Typical useClassic star schemaMany-to-many via bridge; filter dimension by fact
RiskLow, predictableAmbiguity, circular paths, performance
AlternativePrefer scoped CROSSFILTER/TREATAS

For a many-to-many relationship between two dimensions (e.g., Customer × Account), insert a bridge table holding the distinct key pairs and connect each dimension to the bridge via 1:*. Enable both-directional cross-filter on the bridge only if you must propagate the filter. Direct *:* relationships exist but create "limited" relationships and should be used cautiously.

DAX · USERELATIONSHIP on an inactive relationship
// Sales has 2 dates: OrderDate (active) and ShipDate (inactive)
Sales by Ship =
CALCULATE (
    [Total Sales],
    USERELATIONSHIP ( Sales[ShipDateKey], 'Date'[DateKey] )
)

DAX: variables, iterators, windowing

Use variables (VAR/RETURN) for clarity and performance — each VAR is evaluated once, in the context where declared, and reused. Iterators (SUMX, AVERAGEX) evaluate an expression row by row. For table filtering, combine CALCULATE + FILTER/ALL/KEEPFILTERS. Information functions (SELECTEDVALUE, HASONEVALUE, ISFILTERED, ISINSCOPE) inspect context.

DAX · VAR/RETURN + iterator + safe DIVIDE
Margin % =
VAR Revenue = SUMX ( Sales, Sales[Qty] * Sales[Price] )
VAR Cost    = SUMX ( Sales, Sales[Qty] * Sales[UnitCost] )
VAR Profit  = Revenue - Cost
RETURN
    DIVIDE ( Profit, Revenue )   // avoids divide-by-zero error
DAX · CALCULATE + FILTER + KEEPFILTERS
High-Value Sales =
CALCULATE (
    [Total Sales],
    KEEPFILTERS ( FILTER ( Sales, Sales[Price] > 1000 ) )
)

Windowing (WINDOW, OFFSET, INDEX, RANK) operates over a table ordered with ORDERBY/PARTITIONBY — ideal for period-over-period deltas without classic time intelligence.

DAX · OFFSET for prior month
Vs Prior Month =
VAR Current = [Total Sales]
VAR Prior =
    CALCULATE (
        [Total Sales],
        OFFSET ( -1, ALLSELECTED ( 'Date'[Month] ), ORDERBY ( 'Date'[Month] ) )
    )
RETURN Current - Prior

Calculation groups, DFS & field parameters

A calculation group replaces dozens of repeated measures (MTD, QTD, YTD, PY…) with reusable calculation items. SELECTEDMEASURE() is the placeholder for the measure in context. Requires Discourage implicit measures = true — calculation items apply only to explicit measures.

DAX · YTD calculation item with SELECTEDMEASURE
// "YTD" item of the Time Intelligence group
CALCULATE ( SELECTEDMEASURE (), DATESYTD ( 'Date'[Date] ) )

Precedence: when two calculation groups apply to the same measure, the one with higher precedence is applied outermost (evaluated first), and its SELECTEDMEASURE() is replaced by the lower-precedence group, down to the measure.

AspectBehavior
Higher precedenceApplied outermost: (SELECTEDMEASURE()+2)*2 if Times2=200 and Plus2=100
Lower precedenceNested inside, closest to the base measure
Dynamic format stringOnly the highest-precedence group's DFS is applied
Measure with its own DFSTreated as lower precedence than any calculation group
Ordinal vs precedenceOrdinal only orders display; it does not change evaluation order

Dynamic format strings (DFS) apply conditional formatting without forcing the measure to become text. E.g., the YOY% item overrides the format to 0.00%;-0.00%;0.00%; use SELECTEDMEASUREFORMATSTRING() to revert to the base format.

Field parameters and sideways recursion

Field parameters let the user dynamically switch which measures or dimensions a visual shows (they create an implicit calculated table). Sideways recursion: a calculation item can reference another in the same group (YOY% uses YOY and PY) as long as they are in separate CALCULATE statements. RLS and OLS are not supported on the calculation group table itself.

Large semantic model storage format

The Large semantic model storage format removes the 1 GB per-model limit, letting models grow to the capacity limit. Enable it before the first refresh, especially with incremental refresh of models that may exceed 1 GB.

When

Large models

Model may exceed 1 GB, or uses incremental refresh over billions of rows. Requires Premium/Fabric capacity.

How

Configuration

Enable in model settings (or workspace default) before the 1st refresh. Reduces risk of hitting the size cap.

XMLA

Tooling

Enables the XMLA read-write endpoint for SSMS, Tabular Editor, ALM Toolkit — partition management and metadata-only deploy.

Composite models

A composite model mixes storage modes in one model. The Dual mode is the key piece: a Dual table acts as Import (when serving Import tables) or as DirectQuery (when serving DQ tables), reducing limited relationships and improving joins. Dual propagation traverses only the one-side of 1:* relationships.

FeatureDirect Lake on OneLakeDirect Lake on SQL endpoint
Composite (mode mix)✔ combines with Import (web) and DirectQuery (XMLA)— can't combine with DQ/Dual in the same model
User-defined aggregations

Aggregations: Import aggregation tables over DirectQuery tables speed up queries — the engine redirects the query to the aggregation when possible and falls back to the source otherwise. Source groups organize tables by source in the composite. Limitations: a calculated column on a DirectQuery table can only reference columns on the same table; SAP HANA/BW can't join a composite.

Skill 3.2Optimize enterprise-scale semantic models

Query & visual performance

Use the Performance Analyzer (Power BI Desktop) to measure, per visual, DAX query, visual display, and other time. Copy the DAX query of a slow visual into DAX Studio and analyze Server Timings.

Reduce

Fewer visuals

Each visual generates ≥1 DAX query. Cut the number of visuals per page; avoid many redundant cards and slicers.

Avoid

Costly patterns

Avoid high-cardinality columns in slicers, implicit measures, and unnecessary bidirectional filters.

Measure

Performance Analyzer

Sort by DAX query. Isolate the bottleneck: slow query engine ≠ slow rendering.

Improve DAX performance

Every DAX query splits between the formula engine (FE) — single-threaded, resolves complex logic — and the storage engine (SE) — multi-threaded, cacheable, scans VertiPaq. Push work to the SE; large materializations and callbacks to the FE are the classic symptom of slow DAX.

AspectFormula engine (FE)Storage engine (SE / VertiPaq)
ThreadingSingle-threadedMulti-threaded
CacheNot cacheableReusable data cache
RoleLogic, complex iteration, joinsScan/aggregate compressed columns
Tuning goalMinimize CallbackDataID and materializationMaximize % of time here
Fast-DAX checklist

Use variables to avoid re-evaluating subexpressions; replace divisions with DIVIDE; avoid nested iterators (SUMX inside SUMX over large tables); prefer functions the SE resolves on its own. Use VertiPaq Analyzer (in DAX Studio) to find costly columns — high cardinality and large dictionaries dominate model size and memory.

Configure Direct Lake

Direct Lake reads columns from Delta tables in OneLake on demand. Understand the cycle: framing (metadata) → transcoding (column load) → query → possible fallback. A Direct Lake refresh is framing: it copies only metadata and points to the latest Parquet — seconds, not Import's full copy.

1
FramingRefresh analyzes the Delta log; sets the point-in-time baseline; may evict resident columns
2
TranscodingOn the 1st query needing a column, loads it whole from OneLake into memory (becomes resident)
3
QueryVertiPaq answers from memory; later queries over resident columns don't reload
4
FallbackOn SQL only: if a condition isn't met, falls back to DirectQuery on the SQL endpoint

Automatic updates ("Keep your Direct Lake data up to date"), on by default, triggers framing when a Delta change is detected — scoped only to the changed tables. Turn it off to hold data until ETL finishes; reframe manually, on schedule, via REST API, or TOM. After a non-recoverable error, Power BI suspends automatic updates until a successful on-demand refresh.

DirectLakeBehavior (SQL only)Behavior
Automatic (default)If a condition fails, silently falls back to DirectQuery. Use in production.
DirectLakeOnlyIf a condition fails, the query errors. Use in development to surface issues.
DirectQueryOnlyAlways DirectQuery. Use to measure fallback performance.
Guardrails and diagnosis

Limits per SKU (Parquet files/table, row groups, rows, size, memory). Exceeding a guardrail: on OneLake the refresh fails; on SQL it falls back (if enabled). Diagnose with EVALUATE TABLETRAITS() — the [DirectLakeFallbackInfo] column shows the reason; None = Direct Lake. Fix an unmaterialized view, SQL RLS/OLS, an unframed table, or run OPTIMIZE/VACUUM on the Delta table.

Direct Lake: OneLake vs SQL endpoint

Two variants with distinct trade-offs, chiefly in security and fallback.

CriterionDirect Lake on OneLakeDirect Lake on SQL endpoint
SourcesOne or more Fabric sources with DeltaA single source (lakehouse or warehouse)
DirectQuery fallback— unsupported (runs DirectLakeOnly)✔ falls back to DQ via SQL endpoint
Composite model✔ combines with Import (and DQ via XMLA)— not in the same model
SQL views / OLS / DDM at endpointNot observed (needs OneLake file access)Supported — but forces fallback
SQL endpoint RLSNot applied (uses OneLake security)Applied — but query falls back to DQ
Semantic model RLS✔ (recommend fixed identity)✔ (recommend fixed identity)
RecommendationNew models, leaner DAX plans, OneLake integrationReuse SQL endpoint, views, granular SQL security
Rule of thumb

For new models, prefer Direct Lake on OneLake: no fallback, leaner DAX plans, and composite with Import. Choose on SQL endpoint when you need views, granular security (RLS/OLS/DDM) defined in SQL, or compatibility with the existing endpoint — accepting the risk of DirectQuery fallback.

Incremental refresh

Incremental refresh partitions the table and refreshes only the recent period, using two date/time Power Query parameters with reserved, case-sensitive names: RangeStart (oldest) and RangeEnd (newest). You filter the date column by them; the service overrides the values per partition at refresh time (a rolling window pattern).

Power Query · filter by RangeStart/RangeEnd
let
  Source = Sql.Database("srv", "DW"),
  Data = Source{[Schema="dbo", Item="FactSales"]}[Data],
  Ini = Table.SelectRows(Data, each [OrderDate] >= RangeStart),
  Fin = Table.SelectRows(Ini,  each [OrderDate] < RangeEnd)
in Fin
SettingRole
Archive data starting before (store)Total historical period kept in the model (rolling window).
Incrementally refresh starting beforeRecent period refreshed each operation (e.g., last 3 days).
Get latest data with DirectQueryReal-time DQ partition beyond the period — Premium only (hybrid table).
Only refresh complete daysWhole days only; required if the real-time DQ partition is on.
Detect data changesA last-updated column (≠ the partition column); refreshes only changed periods.
Query folding is mandatory

The RangeStart/RangeEnd filter must fold to the source; otherwise the engine pulls the whole table and filters locally — defeating the purpose. With a real-time DQ partition, non-folding transformations are not allowed. All partitions must come from a single source. After publishing, you can't download the .pbix back. UTC is the default "current date" unless a time zone is configured.

Cheat sheets

Numbers worth memorizing

ValueWhat it applies to
700 / 1000Passing score
25–30% · 45–50% · 25–30%Weights: Maintain the solution · Prepare data · Semantic models
2 to 10 (default 3)Stages in a deployment pipeline
4 storage modesImport · DirectQuery · Direct Lake · Dual
48 refreshes/dayScheduled refresh limit (Pro); XMLA read-write bypasses it with partitions
RangeStart · RangeEndReserved (case-sensitive) incremental-refresh parameters
1 active relationship per pairOnly one active path between two tables; the rest need USERELATIONSHIP
Single vs BothA relationship's cross-filter direction
Large semantic model formatNeeds Premium/PPU/Fabric capacity + XMLA for large models
~5 min · ~1 hPropagation of a OneLake role change · of a group change

Decision flowcharts in words

"Where should this data live?"

Streaming/telemetry/logs, KQL people → Eventhouse. Full T-SQL DML and multi-table transactions → Warehouse. Spark, unstructured, ML → Lakehouse. OLTP app → SQL database in Fabric. Already in another lake → shortcut. Operational DB to replicate continuously → mirror.

"Which model storage mode?"

Best performance and fits in memory → Import. Huge OneLake volume with no refresh cost → Direct Lake. Near-real-time with no copy, or giant source → DirectQuery. Shared dimension in a composite model → Dual.

"Why is the measure slow?"

Nested iterators or costly context transition → rewrite with a lean SUMX and variables. Storage engine idle and formula engine at 100% → materialize with variables. Bidirectional cross-filter → swap for single + CROSSFILTER. Direct Lake fell back to DirectQuery → check guardrails and RLS.

"Who can see what?"

Whole workspace → workspace role. One item → item permission (+ Build for the model). OneLake folders/tables → OneLake role. Rows → RLS. Columns → CLS. Model tables/columns → OLS. Classify and protect on export → sensitivity label.

SQL vs. KQL vs. DAX — the same question, three dialects

OperationT-SQLKQLDAX
Filter rowsWHERE x > 5| where x > 5FILTER(T, T[x] > 5)
Select columnsSELECT a, b| project a, bSELECTCOLUMNS(T, ...)
Aggregate by groupGROUP BY g| summarize sum(x) by gSUMMARIZECOLUMNS(g, "S", SUM(...))
Conditional sumSUM(CASE WHEN…)summarize sumif(x, cond)CALCULATE(SUM(x), cond)
Top NSELECT TOP 10 … ORDER BY| top 10 by x descTOPN(10, T, T[x], DESC)
Distinct countCOUNT(DISTINCT x)dcount(x)DISTINCTCOUNT(x)
Join tablesJOIN … ON| join kind=inner (…)relationship + RELATED
Running totalSUM() OVER (ORDER BY)row_cumsum(x)CALCULATE(…, DATESYTD())

A four-week study plan

Week 1
Fundamentals + Domain 2AOneLake, item taxonomy, the store decision guide and storage modes. Then get data: connections, shortcuts, mirroring, Copy job. Build a lakehouse and a warehouse by hand.
Week 2
Domain 2B + 2CTransform: views/functions/procs, star schema, denormalization, cleaning. Then query in all four dialects — Visual Query Editor, SQL, KQL and DAX. One exercise a day in each.
Week 3
Domain 3Storage modes, star schema in the model, relationships, DAX (filter context, iterators, windowing), calculation groups, Direct Lake and incremental refresh. Optimize a real model.
Week 4
Domain 1 + reviewSecurity (RLS/CLS/OLS, OneLake roles, labels, endorsement), Git, deployment pipelines, .pbip, XMLA, impact analysis. Then re-walk the skills outline out loud.

The readiness checklist

Tick each item only when you can explain it to someone else without looking anything up.

  • Domain 1 · Maintain a data analytics solution
  • Implement workspace-level and item-level access controls (incl. Build permission)
  • Implement RLS, CLS, OLS and file-level access (Warehouse, semantic model and OneLake roles)
  • Apply sensitivity labels and endorse items (Promoted / Certified / Master data)
  • Configure version control (Git integration) and Power BI projects (.pbip)
  • Create and configure deployment pipelines, deployment rules and parameter rules
  • Perform impact analysis of downstream dependencies
  • Deploy and manage semantic models via the XMLA endpoint
  • Create and update reusable assets (.pbit, .pbids, shared semantic models)
  • Domain 2 · Prepare data
  • Create data connections and choose the right gateway
  • Discover data with the OneLake catalog and Real-Time hub
  • Choose between ingesting and accessing (shortcut vs mirror vs copy)
  • Choose between the data stores
  • Implement OneLake integration for Eventhouse and semantic models
  • Create views, functions and stored procedures
  • Implement a star schema in a lakehouse or warehouse
  • Enrich, denormalize, aggregate and join data
  • Handle duplicates, missing data and nulls; convert types; filter
  • Query and aggregate with the Visual Query Editor, SQL, KQL and DAX
  • Domain 3 · Implement and manage semantic models
  • Choose a storage mode (Import/DirectQuery/Direct Lake/Dual)
  • Implement a star schema in the semantic model
  • Implement relationships: bridge tables and many-to-many
  • Write DAX with variables, iterators, table filtering, windowing and information functions
  • Implement calculation groups, dynamic format strings and field parameters
  • Configure large semantic model storage format and composite models
  • Improve query, visual and DAX performance
  • Configure Direct Lake (fallback and refresh) and choose OneLake vs SQL endpoint
  • Implement incremental refresh
Two days before the exam

Stop reading and start building. On a trial capacity: load a CSV into a lakehouse, model a small star schema in a warehouse with MERGE, build a Direct Lake semantic model, write five DAX measures (one with CALCULATE, one with SUMX, one time-intelligence, one windowing and one via a calculation group), configure RLS, connect the workspace to Git and promote everything through a two-stage deployment pipeline. Whatever you trip over is what you need to review.