DIRECTQUERY é um assunto muito, muito extenso, então aqui vou tentar uma abordagem mais focada no que eu acredito que seja material adequado para o Exame de Certificação DA-100.
DirectQuery é um tipo de obtenção de dados, então se vc vai lá e dá um “GET DATA” vai ver que pra algumas fontes de dados tem a opção de import e também tem a opção de DirectQuery.
No SQL Server mesmo, por exemplo, tem essa opção:

Então a pergunta que fica é… Quando devo usar o Import ou quando devo usar o DirectQuery???
Vou falar sobre import num outro post, aqui vou focar nas qualidades e defeitos do DirectQuery e a partir daí vc pode tirar suas próprias conclusões. Porém, a própria Microsoft fala o seguinte no site dela:
“Você deve IMPORT dados para o Power BI sempre que possível. A IMPORT aproveita o mecanismo de consulta de alto desempenho do Power BI e proporciona uma experiência altamente interativa e completa.” (link)
Vou tentar contar uma história, criar um contexto, pra ficar mais fácil de explicar o DirectQuery. Então imagina o seguinte, pensa que vc tem um banco de dados gigante e vc precisa mostrar esses dados no seu dashboard atualizados a cada 30 minutos. Se vc usar o import nesse caso ele vai precisar ficar fazendo a carga de uma porrada de dados a cada 30 minutos e isso provavelmente vai demorar muito, então acaba não sendo um bom negócio.
Base de dados grande demais
Nesse cenário, é uma boa usar o DirectQuery porque ele não carrega os dados fisicamente no cache do seu power BI, ele na verdade apenas salva um schema do seu banco no power bi e na hora de buscar os dados ele vai direto na sua fonte de dados, ou seja, toda vez que vc quer ver ou fazer alguma coisa no power bi e estiver usando DirectQuery ele vai rodar uma query no seu banco.
Falando em SCHEMA, importante lembrar o seguinte… se lá na sua base de dados os caras mudarem o SCHEMA, ele não vai refletir automaticamente no seu power bi… Pra resolver isso vc tem que ir manualmente dentro do seu Power BI Desktop e apertar o botão Refresh.
Então beleza. Se os dados são muito grandes pra ficar importando e a atualização é muito frequente, melhor usar o DirectQuery. O bom disso também é que o DirectQuery, por deixar os dados na origem, não consome sua quantidade de armazenamento do Power BI Service Online (se vc não sabe, o Power BI Online tem uma quantidade limitada de Gigas que pode armazenar, mas isso é conversa pra outro post).
Só que se liga, se vc está usando um DirectQuery não significa que se o cara fizer um update ou insert lá no seu banco que os dados vão estar na mesma hora atualizados no seu power bi… Não, isso demora um tempo. Se vc estiver falando de Power BI desktop, vc precisar apertar o Refresh, se estiver falando de Power BI Service vc precisa aguardar o refresh automático do gateway acontecer, que pode ser de 15min a 1 hora, por padrão é 1 hora (pode ser que atualize sem gateway tb, depois explico isso em outro post).
Só que assim, tem uma complicação aqui, que é o seguinte… Se vc está fazendo uns gráficos (visuals) e já tem outros feitos, os gráficos antigos não vão sendo atualizados, mas a medida que vc mexe nos gráficos novos uma nova query é feita no banco e retorna os dados. Isso pode acabar fazendo com que alguns visuais estejam mais atualizados que os outros, pq depende se a query por trás daquele visual rodou ou não.
Limitação nas transformações de dados
É sempre importante lembrar que tudo e qualquer coisa que vc fizer no DirectQuery vai gerar uma query e que isso vai ir lá no banco, pegar os dados e retornar pro power bi.
Então pensa assim, se vc tem uma quantidade gigante de queries toda hora rolando no seu banco, uma boa ideia eh garantir que essas queries sejam mais simples, pra executar de forma mais rápida e, por isso, o Power BI tem limitações nas fórmulas DAX e nas transformações no Power Query quando usando DirectQuery.
Isso porque todas essas transformações afetam todas as queries a que elas se relacionam. Então se vc tem uma transformação na tabela X, todas queries que saírem dessa tabela X vao ter que mandar essa transformação como parâmetro de query. Ideal seria se a query rodasse uma vez e a partir desse resultado o restante das queries rodasse, mas não é assim não…
Topificando…
Bons motivos para usar DirectQuery, são:
- Se os volumes de dados forem muito grandes para serem mantidos em um Modelo de Dados do Power BI (já expliquei acima)
- Se você precisar de uma conexão quase em tempo real com os dados, em vez de apenas mostrar dados a partir da última atualização (também já expliquei no primeiro exemplo)
- Se você não deseja armazenar dados no Power BI (Cloud), mas mantê-los na sua base local (como expliquei, os dados não sobem pro power bi service, não ficam armazenados lá)
- Se você deseja utilizar o SSO (Single Sign On) para retornar as credenciais do usuário para sua fonte de dados, desde que a fonte de dados permita SSO, claro
Alguns motivos mais comuns que podem deixar seu report com DirectQuery mais lento:
- Cada interação com um item no relatório do Power BI (por exemplo, filtros, ou até mesmo interação entre visuals) exige que uma query seja enviada pra sua fonte de dados calcular
- As consultas em DAX tem que ser traduzidas pra linguagem da sua fonte de dados, então tipo, DAX tem que virar SQL e aí dependendo do DAX que vc escreveu isso pode virar uma query bem feia e pesada
- As agregações usando DAX são feitas na fonte, ou seja, as medidas aqui não funcionam exatamente como que no modo Import que roda as measures dentro do Power BI. No caso do DirectQuery as agregações, tipo =SUM(ValorVendas) são feitas na origem e depois retornados pro power bi
Mais algumas limitações do DirectQuery, só que no Power BI Service Online:
- Usando DirectQuery seu report não roda Quick Insights. Essa função foi desativada porque ela é complexa demais pra rodar num DirectQuery, ou seja, performance.
- Usando DirectQuery seu report não roda Q&A, problema de performance tb.
- Usando DirectQuery é altamente recomendável que vc não faça uso do “explore in excel”, e mais performance.
- Limite de 1 milhão de linhas retornadas
Deixa eu falar mais sobre esse 1 milhão de linhas… Aqui é o seguinte, se vc fizer um select * from e retornar 2 milhoes de linha o Power BI vai retornar um erro e não vai carregar seus dados. Então, denovo, cuidado com as queries que vcs usam nesse modo de DirectQuery. Isso pode acontecer também na criação de um visual, ok? Imagina que você tem um visual de vendas por vendedor e vc tem 1 milhão de vendedores, já elvis, não vai rolar. Pra evitar isso, antes filtre, aplique um filtro no seu visual.
Outra coisa, DirectQuery e RLS (row level security) não conversam exatamente muito bem. Porque quando se tem RLS implementado o power bi roda cada query uma vez por pessoa, já que o RLS é implementado nesse nível de pessoa. Um exemplo que a própria Microsoft dá é esse:
“Um dashboard com 10 blocos (tiles), compartilhado com 100 usuários, criado em um conjunto de dados usando o DirectQuery com segurança no nível da linha (RLS) e configurado para atualizar a cada 15 minutos, resultaria em pelo menos 1000 consultas sendo enviadas a cada 15 minutos para a fonte de back-end.”
Outra coisa… Se vc importou uma tabela como DirectQuery vc pode até mudar o tipo dela pra IMPORT, só que, uma vez que fizer isso não tem mais volta, ou seja, dá pra mudar de DirectQuery pra Import, mas de Import pra DirectQuery não tem como. Quando vc vai fazer isso o Power BI te avisa, olha a img:

Mais informações:
https://docs.microsoft.com/pt-br/power-bi/connect-data/desktop-directquery-about