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.
- 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".
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
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.
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.
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.
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.
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.
- 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
Lakehouse
Tabelas Delta + arquivos, Spark em primeiro lugar, com um SQL analytics endpoint somente leitura anexado. Schema-on-read; suporta schemas nomeados.
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.
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.
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.
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.
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.
| Store | Carga ideal | Persona / habilidade | API de escrita | Transações multi-tabela |
|---|---|---|---|---|
| Lakehouse | Big data, ML, dados não e semiestruturados, engenharia de dados | Data engineer, data scientist — Spark | Spark (PySpark, Scala, Spark SQL, R), pipelines, Dataflows | Não |
| Warehouse | DW corporativo, BI baseado em SQL, transações completas | Desenvolvedor de DW, analytics engineer — T-SQL | DML em T-SQL, COPY INTO, CTAS, pipelines, Dataflows | Sim |
| Eventhouse / KQL DB | Streaming, telemetria, logs, análise de alta granularidade | Desenvolvedor de aplicações, data engineer — KQL | Eventstream, SDKs, Kafka, .ingest | Não |
| SQL database no Fabric | OLTP operacional dentro do Fabric | Desenvolvedor de aplicação/banco — T-SQL | T-SQL (superfície OLTP completa) | Sim |
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.
| Modo | Onde os dados ficam | Latência de consulta | Atualização | Use quando |
|---|---|---|---|---|
| Import | Em memória (VertiPaq), copiado para o modelo | A mais rápida | Refresh agendado/incremental | Padrão; melhor performance; dados cabem na memória |
| DirectQuery | Fica na fonte; consulta enviada a cada visual | A mais lenta (round-trip à fonte) | Sempre ao vivo | Dados enormes ou near-real-time; sem cópia |
| Direct Lake | Lido direto do Delta no OneLake, sob demanda | Perto de Import | Reframing automático quando o Delta muda | Grandes volumes no OneLake sem custo de refresh do Import |
| Dual | Import e DirectQuery; o engine decide | Varia | Ambos | Dimensões em composite models, para evitar limit queries |
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).
| Capacidade | Admin | Member | Contributor | Viewer |
|---|---|---|---|---|
| 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
Warehouse & SQL endpoint
Modelar e transformar em batch, criar views/functions/procs, carregar dimensões com MERGE. Set-based, schema-on-write.
Eventhouse
Explorar logs e séries temporais. Pipeline de operadores (where → summarize → project), ótimo para telemetria de alta granularidade.
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.
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).
| Escopo | O que controla | Como é concedido | Granularidade |
|---|---|---|---|
| Workspace role | Todos os itens do workspace (plano de controle) | Admin/Member/Contributor/Viewer atribuído a usuário ou grupo | Grossa (workspace inteiro) |
| Item permission | Um único item (share) | Compartilhar item → Read (+ Reshare, Build, Write conforme o item) | Item individual |
| OneLake data-access role | Pastas, arquivos e tabelas no OneLake | Role RBAC do OneLake (Read/ReadWrite) no lakehouse | Pasta / arquivo / tabela |
| RLS / CLS / OLS | Linhas, colunas e objetos dentro de uma tabela/modelo | T-SQL no Warehouse; DAX/Tabular no semantic model | Linha / coluna / objeto |
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.
| Capacidade | Admin | Member | Contributor | Viewer |
|---|---|---|---|---|
| Excluir o workspace | ✔ | — | — | — |
| Adicionar admins | ✔ | — | — | — |
| Adicionar members | ✔ | ✔ | — | — |
| Compartilhar itens / gerenciar permissões | ✔ | ✔ | — | — |
| Escrever dados / criar itens | ✔ | ✔ | ✔ | — |
| Ler dados | ✔ | ✔ | ✔ | ✔ |
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.
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.
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 item | O que habilita |
|---|---|
| Read | Ver metadados e relatórios; padrão ao compartilhar |
| Reshare | Compartilhar 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 / Edit | Modificar o item; para semantic model equivale a admin de database Analysis Services |
| ReadData / ReadAll (Lakehouse/Warehouse) | Consultar os dados via SQL endpoint ou OneLake |
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.
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.
| Controle | Onde se define | Mecanismo |
|---|---|---|
| RLS (linha) | Warehouse/SQL endpoint · semantic model · OneLake | T-SQL SECURITY POLICY + predicate function · DAX role · role OneLake |
| CLS (coluna) | Warehouse/SQL endpoint · OneLake | T-SQL GRANT/DENY por coluna · deny-list na role OneLake |
| OLS (objeto) | Semantic model | Tabular (Tabular Editor) esconde tabelas/colunas do modelo |
| Arquivo / pasta | OneLake | Role OneLake Read/ReadWrite sobre o path |
-- 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);
-- 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'
-- 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).
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).
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.
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.
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.
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:
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.
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.
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.
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.
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).
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.
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.
Project/ ├── AdventureWorks.Report/ -- definition.pbir (PBIR) ├── AdventureWorks.SemanticModel/ -- definition.pbism + TMDL ├── .gitignore -- ignora cache.abf, localSettings └── AdventureWorks.pbip -- ponteiro p/ a pasta Report
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.
Formato do relatório
O relatório usa o formato aprimorado PBIR (definition.pbir), permitindo reusar páginas e versionar visuais individualmente.
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.
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.
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.
| Regra | O que faz |
|---|---|
| Deployment rule | Sobrescreve a fonte de dados no estágio de destino (ex.: Dev aponta para DB de teste, Prod para DB de produção) |
| Parameter rule | Define valores de parâmetros específicos por estágio |
| Autobinding | Religa automaticamente as referências (ex.: relatório → semantic model) ao item pareado no estágio de destino |
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.
| Ferramenta | Escopo | Uso típico |
|---|---|---|
| Lineage view | Itens do workspace + fontes externas 1 nível upstream | "De onde vêm os dados deste relatório?" |
| Impact analysis | Dependentes downstream (mesmo em outros workspaces) | "O que quebra se eu mudar este lakehouse/warehouse/dataflow/semantic model?" |
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.
| Ferramenta | Read-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) | — | ✔ |
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.
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.
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.
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.
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.
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.
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.
| Tipo | Quando usar | Onde a fonte vive | Instala 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 corporativo | On-premises | Sim — instala no host da rede local |
| VNet data gateway | Fonte em Azure Virtual Network, atrás de private endpoint/firewall | Azure VNet privada | ✔ Não — gerenciado pela Microsoft |
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.
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.
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.
| Credencial | Descrição | Uso típico |
|---|---|---|
| Basic | Usuário e senha da fonte | Bancos SQL/ODBC legados |
| OAuth 2.0 / conta organizacional | Identidade Microsoft Entra ID; suporta SSO em cenários compatíveis | Fontes Microsoft e SaaS modernas |
| Service principal | Identidade de aplicativo (tenant/client id + secret) para automação sem usuário | Pipelines, CI/CD, ingestão não supervisionada |
| Chave de conta / SAS | Storage account key ou token SAS com escopo/tempo limitado | Azure Blob, ADLS Gen2 |
| Anônimo | Sem credencial — endpoint público | APIs/arquivos abertos |
| Chave (Key) | API key ou access key da fonte | S3, 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.
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.
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.
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.
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 descobre | OneLake catalog | Real-Time hub |
|---|---|---|
| Natureza do dado | Em repouso (Delta, tabelas, arquivos) | Em movimento (streams, eventos) |
| Itens listados | Lakehouses, Warehouses, semantic models, KQL DBs, relatórios | Eventstreams, Fabric events, Azure events |
| Foco | Governança, endosso, exploração ad-hoc | Conectar, previsualizar e rotear eventos |
| Ação típica | Explorar dados, ver lineage, aplicar rótulos | Criar 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ério | Shortcut | Mirroring | Copy (job / activity) |
|---|---|---|---|
| Movimento de dados | Nenhum — referência virtual | Réplica contínua (CDC) para OneLake | Có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 |
| Custo | Sem duplicação de storage | ✔ Compute grátis; storage grátis até o limite incluído | Consome compute do pipeline |
| Transformação no caminho | Não | Nã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ência | Instantânea (lê a origem) | Baixa (~segundos sob boas condições) | Depende do agendamento/tamanho |
| Melhor para | Evitar cópia; single source of truth; bronze/onboarding rápido | Base operacional (Azure SQL, PostgreSQL, Cosmos DB) → gold analytics | ELT/ETL metadata-driven, orquestração, migração |
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.
| Modalidade | O que replica | Fontes |
|---|---|---|
| Database mirroring | Dados e metadados, gravados como Delta no OneLake via CDC | Azure SQL DB, Azure SQL MI, SQL Server, Azure Cosmos DB, Azure Database for PostgreSQL, Snowflake, Fabric SQL DB |
| Metadata mirroring | Só a estrutura de catálogo — os dados são acessados por shortcuts | Azure Databricks (Unity Catalog) |
| Open mirroring | Você envia os dados de mudança para uma landing zone via API pública | Qualquer 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á.
| Categoria | Alvos suportados |
|---|---|
| Internos (OneLake) | Lakehouses, Warehouses, KQL databases, SQL databases, Mirrored Databases, Mirrored Azure Databricks Catalogs, Semantic models |
| Externos | ADLS Gen2, Azure Blob, Amazon S3 (e S3-compatible), Google Cloud Storage, Dataverse, Iceberg, OneDrive/SharePoint |
| On-premises | Caminhos restritos por rede via on-premises data gateway (OPDG) |
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
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.
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.
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.
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 job | O que faz | Quando usar |
|---|---|---|
| Full | Copia o dataset inteiro a cada execução | Tabelas 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 |
| CDC | Aplica inserts/updates/deletes capturados na origem | Fonte com change tracking e necessidade de deletes |
# 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.
| Fator | Lakehouse | Warehouse | Eventhouse | SQL database |
|---|---|---|---|---|
| Persona / interface | Data engineer / cientista — Spark | SQL developer — T-SQL | Analista real-time — KQL | Dev de app — T-SQL OLTP |
| Linguagem primária | PySpark, Spark SQL | T-SQL | KQL | T-SQL |
| Tipo de dado | Estruturado + não estruturado | Estruturado | Semiestruturado, séries temporais, logs | Estruturado operacional |
| Escrita / DML | Spark; SQL endpoint é read-only | ✔ Full T-SQL DML/DDL | Ingestão via stream/queued | ✔ OLTP transacional |
| Transações multi-tabela | Não (garantia por tabela Delta) | ✔ Sim | Não | ✔ Sim |
| Latência | Batch | Batch / interativa | ✔ Sub-segundo em séries temporais | OLTP baixa latência |
| Formato de storage | Delta (OneLake) | Delta (OneLake) | Motor Kusto; Delta via OneLake availability | Delta espelhado em OneLake |
| Caso de uso típico | Medallion, ML, dados heterogêneos | Data warehouse enterprise, BI | Reporting operacional em grande escala, IoT | Reporting operacional pequeno/médio |
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.
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.
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.
external_table('vendas_gold') | where Regiao == "Sul" | take 100
| Aspecto | Direct Lake on OneLake | Direct Lake on SQL endpoint |
|---|---|---|
| Fonte | Qualquer item Fabric com tabelas Delta | Somente lakehouse/warehouse (tabelas ou views) |
| Fallback para DirectQuery | Não faz fallback | ✔ Faz fallback (ex.: SQL view, RLS) |
| Composite model | ✔ Combina com Import | Não |
| RLS do endpoint SQL | Não aplica (usa acesso a arquivos no OneLake) | ✔ Aplica (via fallback) |
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.
| Objeto | Para quê | Warehouse | SQL endpoint do Lakehouse |
|---|---|---|---|
| VIEW | Encapsular consulta reutilizável | ✔ | ✔ |
| Inline TVF | View parametrizada (retorna tabela) | ✔ | ✔ |
| Função escalar | Cálculo que retorna um valor | ✔ | ✔ |
| PROCEDURE (DML) | Carga/transformação com INSERT/UPDATE/MERGE | ✔ | Não (read-only) |
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;
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 );
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.
withColumn
df.withColumn("margem", col("preco")-col("custo"))
Coluna computada
ALTER TABLE ... ADD margem AS (preco-custo)
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.
| Elemento | Fato | Dimensão |
|---|---|---|
| Conteúdo | Métricas numéricas + chaves estrangeiras | Atributos descritivos + surrogate key |
| Granularidade | Uma linha por evento | Uma linha por membro |
| Cardinalidade | Muitas linhas (lado "muitos") | Poucas linhas (lado "um") |
| Chave | FK surrogate para cada dimensão | Surrogate key (PK) + business key |
| Exemplos | fato_vendas, fato_visitas | dim_produto, dim_cliente, dim_data |
Slowly Changing Dimensions (SCD). Gerenciam mudança de atributos de dimensão ao longo do tempo.
| Tipo | Comportamento | Histórico |
|---|---|---|
| Type 1 | Sobrescreve o valor antigo | Nenhum |
| Type 2 | Nova linha com surrogate key, StartDate/EndDate e IsCurrent | ✔ Completo (versionado) |
| Type 3 | Coluna extra guardando o valor anterior | Limitado (só a versão imediatamente anterior) |
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.
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);
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:
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")
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;
let Fonte = fato_vendas, Agrup = Table.Group(Fonte, { "ano", "mes", "categoria" }, { { "total", each List.Sum([valor]), type number } }) in Agrup
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).
| Tipo | Retorna | PySpark | T-SQL |
|---|---|---|---|
| Inner | Só 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 anti | Esquerda sem correspondência (o que falta) | "left_anti" | WHERE NOT EXISTS |
| Left semi | Esquerda que tem correspondência (sem colunas da direita) | "left_semi" | WHERE EXISTS |
| Objetivo | PySpark | T-SQL | Power Query |
|---|---|---|---|
| Enriquecer fato com dimensão | df1.join(df2, "chave", "left") | LEFT JOIN dim ON f.k = dim.k | Mesclar Consultas → Junção à Esquerda Externa |
| Só correspondentes | join(df2, "chave", "inner") | INNER JOIN | Junção Interna |
| Anti-join (o que falta) | join(df2, "chave", "left_anti") | WHERE NOT EXISTS (...) | Junção Anti à Esquerda |
vendas_enr = (fato .join(dim_produto, "prod_key", "left") .join(dim_cliente, "cliente_key", "left") .select("data_key", "categoria", "segmento", "valor"))
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:
| Problema | PySpark | T-SQL | Power Query |
|---|---|---|---|
| Duplicados | dropDuplicates(["k"]) | ROW_NUMBER() OVER(PARTITION BY k)=1 | Table.Distinct / Remover Duplicatas |
| Imputar nulo | fillna({"v":0}) | ISNULL(v,0) / COALESCE(v,0) | Table.ReplaceValue / Substituir Valores |
| Filtrar nulo | filter(col("x").isNotNull()) | WHERE x IS NOT NULL | Remover Linhas em Branco |
limpo = (bruto .dropDuplicates(["pedido_id"]) .fillna({"desconto": 0, "canal": "desconhecido"}) .filter(F.col("cliente_id").isNotNull()))
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;
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ção | PySpark | T-SQL | Power Query |
|---|---|---|---|
| Converter tipo | col("v").cast("decimal(18,2)") | CAST(v AS DECIMAL(18,2)) | Table.TransformColumnTypes |
| Conversão segura | cast(...) retorna null se falhar | TRY_CAST / TRY_CONVERT | Alterar Tipo com Locale |
| Filtrar linhas | filter(col("ano")=2026) | WHERE ano = 2026 | Table.SelectRows |
| Data de string | to_date(col("d"),"yyyy-MM-dd") | TRY_CONVERT(DATE, d) | Tipo → Data |
| Conceito | PySpark / Spark SQL | T-SQL (Warehouse) |
|---|---|---|
| Inteiro | IntegerType / LongType | INT / BIGINT |
| Decimal | DecimalType(p,s) | DECIMAL(p,s) |
| Texto | StringType | VARCHAR(n) |
| Data / hora | DateType / TimestampType | DATE / DATETIME2 |
| Booleano | BooleanType | BIT |
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.
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.
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.
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).
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;
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 KQL | Equivalente SQL | Faz |
|---|---|---|
| where | WHERE | Filtra linhas |
| project | SELECT (colunas) | Escolhe/renomeia colunas |
| extend | SELECT expr AS col | Cria coluna calculada |
| summarize | GROUP BY + agg | Agrega por chave |
| top | ORDER BY + TOP | N maiores por expressão |
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
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.
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
EVALUATE TOPN ( 5, SUMMARIZECOLUMNS ( dim_produto[categoria], "Receita", SUM ( fato_vendas[valor] ) ), [Receita], DESC )
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.
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ério | Import | DirectQuery | Direct Lake | Dual |
|---|---|---|---|---|
| Engine de query | VertiPaq (memória) | Federada à fonte | VertiPaq (memória) | VertiPaq ou fonte |
| Cópia dos dados | ✔ snapshot completo | — | — (lê Delta on-demand) | cache quando útil |
| Frescor dos dados | na última refresh | tempo real | último framing | depende |
| Performance típica | Rápida | Mais lenta | Rápida (~Import) | Otimiza junções |
| Fonte | Qualquer conector | Conector com DQ | Delta no OneLake | Fonte com Import+DQ |
| Licença | Qualquer (inclui Free) | Qualquer (inclui Free) | Só capacidade Fabric (F/P SKU) | Qualquer |
| Uso ideal | Self-service, dados médios | Fonte volátil, sem cache | Camada gold, grandes volumes | Dimensões em composite |
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.
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.
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.
Desnormalize
Colapse hierarquias snowflake numa só dimensão. Coluna do lado "um" precisa ser única — Direct Lake falha a query se houver duplicatas.
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-filter | Single (recomendado) | Both (bidirecional) |
|---|---|---|
| Direção do filtro | Dimensão → fato | Ambos os lados |
| Uso típico | Star schema clássico | Many-to-many via bridge; filtrar dimensão pela fato |
| Risco | Baixo, previsível | Ambiguidade, caminhos circulares, performance |
| Alternativa | — | Preferir 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.
// 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.
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
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.
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.
// 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.
| Aspecto | Comportamento |
|---|---|
| Maior precedência | Aplicado por fora (outermost): (SELECTEDMEASURE()+2)*2 se Times2=200 e Plus2=100 |
| Menor precedência | Aninhado por dentro, mais próximo da medida base |
| Dynamic format string | Só o do grupo de maior precedência é aplicado |
| Medida com DFS própria | Tratada como precedência menor que qualquer calculation group |
| Ordinal vs precedence | Ordinal 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 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.
Modelos grandes
Modelo pode exceder 1 GB, ou usa incremental refresh com bilhões de linhas. Exige capacidade Premium/Fabric.
Configuração
Ative nas settings do modelo (ou default do workspace) antes da 1ª refresh. Reduz risco de estourar o limite de tamanho.
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:*.
| Recurso | Direct Lake on OneLake | Direct 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.
Menos visuais
Cada visual gera ≥1 query DAX. Reduza o número de visuais por página; evite muitos cards e slicers redundantes.
Padrões caros
Evite colunas de alta cardinalidade em slicers, medidas implícitas e filtros bidirecionais desnecessários.
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.
| Aspecto | Formula engine (FE) | Storage engine (SE / VertiPaq) |
|---|---|---|
| Threading | Single-thread | Multi-thread |
| Cache | Não cacheável | Cache de dados reutilizável |
| Função | Lógica, iteração complexa, junções | Scan/agregação de colunas comprimidas |
| Meta de tuning | Minimizar CallbackDataID e materialização | Maximizar % do tempo aqui |
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.
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. |
| DirectLakeOnly | Se a condição falha, a query dá erro. Uso em desenvolvimento para achar problemas. |
| DirectQueryOnly | Sempre DirectQuery. Uso para medir performance de fallback. |
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ério | Direct Lake on OneLake | Direct Lake on SQL endpoint |
|---|---|---|
| Fontes | Uma ou mais fontes Fabric com Delta | Uma ú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 endpoint | Não observa (exige acesso aos arquivos OneLake) | Suportado — mas força fallback |
| RLS do SQL endpoint | Não aplicada (usa segurança OneLake) | Aplicada — mas query cai para DQ |
| RLS do modelo semântico | ✔ (recomenda fixed identity) | ✔ (recomenda fixed identity) |
| Recomendação | Novos modelos, DAX plans mais eficientes, integração OneLake | Reuso do SQL endpoint, views, segurança granular no SQL |
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).
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
| Setting | Papel |
|---|---|
| Archive data starting before (store) | Período histórico total mantido no modelo (janela deslizante). |
| Incrementally refresh starting before | Período recente refrescado a cada operação (ex.: últimos 3 dias). |
| Get latest data with DirectQuery | Partição DQ em tempo real além do período — só Premium (hybrid table). |
| Only refresh complete days | Só dias inteiros; obrigatório se a partição DQ real-time estiver ligada. |
| Detect data changes | Coluna last-updated (≠ da de partição); refresca só períodos que mudaram. |
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
| Valor | A que se aplica |
|---|---|
| 700 / 1000 | Nota 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 modes | Import · DirectQuery · Direct Lake · Dual |
| 48 refreshes/dia | Limite de refresh agendado (Pro); XMLA read-write contorna com partições |
| RangeStart · RangeEnd | Parâmetros reservados (case-sensitive) do refresh incremental |
| 1 relacionamento ativo por par | Só um caminho ativo entre duas tabelas; os demais exigem USERELATIONSHIP |
| Single vs Both | Direção de cross-filter de um relacionamento |
| Large semantic model format | Exige capacity Premium/PPU/Fabric + XMLA para modelos grandes |
| ~5 min · ~1 h | Propagaçã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ção | T-SQL | KQL | DAX |
|---|---|---|---|
| Filtrar linhas | WHERE x > 5 | | where x > 5 | FILTER(T, T[x] > 5) |
| Selecionar colunas | SELECT a, b | | project a, b | SELECTCOLUMNS(T, ...) |
| Agregar por grupo | GROUP BY g | | summarize sum(x) by g | SUMMARIZECOLUMNS(g, "S", SUM(...)) |
| Soma condicional | SUM(CASE WHEN…) | summarize sumif(x, cond) | CALCULATE(SUM(x), cond) |
| Top N | SELECT TOP 10 … ORDER BY | | top 10 by x desc | TOPN(10, T, T[x], DESC) |
| Contagem distinta | COUNT(DISTINCT x) | dcount(x) | DISTINCTCOUNT(x) |
| Juntar tabelas | JOIN … ON | | join kind=inner (…) | relacionamento + RELATED |
| Total corrido | SUM() OVER (ORDER BY) | row_cumsum(x) | CALCULATE(…, DATESYTD()) |
Um plano de estudos de quatro semanas
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
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.