Ir para conteúdo
  • 1

Lentidão no Direct Query quando aplicado função RLS


gustavofill

Pergunta

  • Alunos

Olá pessoal, tudo bem?

Estou com um caso um pouco intrigante gostaria de ver se alguém ja passou por algo parecido ou poderia ajudar a tentar entender o que está acontecendo.

Trabalho muito com Direct Query em meu projeto e estou tendo alguns casos bem estranhos, vou citar o exemplo:

Vamos supor que estou pegando uma medida X via Direct Query.

Se eu simplesmente trazer o resultado, ela leva no máximo 150ms para retornar o resultado.

Se eu selecionar o filtro de RLS aplicando, ela continua levando o mesmo tempo, na maioria dos casos um pouco menos pois são menos informações.

Agora se eu aplicar a RLS através da função, ou logando o usuario a qual ela esta aplicada, leva de 20 a 30 segundos para trazer o mesmo resultado.

Abaixo vou deixar as imagens com a explicação do meu modelo.

exemplo_rls_aplicada.png

exemplo_sem_filtro.png

exemplo_rls_filtro.png

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 1
  • Alunos
18 horas atrás, gustavofill disse:

Olá pessoal, tudo bem?

Estou com um caso um pouco intrigante gostaria de ver se alguém ja passou por algo parecido ou poderia ajudar a tentar entender o que está acontecendo.

Trabalho muito com Direct Query em meu projeto e estou tendo alguns casos bem estranhos, vou citar o exemplo:

Vamos supor que estou pegando uma medida X via Direct Query.

Se eu simplesmente trazer o resultado, ela leva no máximo 150ms para retornar o resultado.

Se eu selecionar o filtro de RLS aplicando, ela continua levando o mesmo tempo, na maioria dos casos um pouco menos pois são menos informações.

Agora se eu aplicar a RLS através da função, ou logando o usuario a qual ela esta aplicada, leva de 20 a 30 segundos para trazer o mesmo resultado.

Abaixo vou deixar as imagens com a explicação do meu modelo.

exemplo_rls_aplicada.png

exemplo_sem_filtro.png

exemplo_rls_filtro.png

Fala meu querido, tudo bem?

Cara a dificuldade ai não é o RLS e sim o funcionamento do próprio direct query.

O direct query vai até o banco e realiza uma "consulta", porque os dados não estão importados dentro do arquivo.

Então cada filtro que você usa, você está aumentando essa consulta (imagina que está fazendo alguns WHEREs no SQL)

Trabalhar com direct query vai diminuir bastante a sua performance, não só com esse filtro mas também com outros (principalmente os que não forem de data)

Tem esse artigo da microsoft que vai te ajudar a melhor a performance, no entanto nunca vai chegar a ser parecido com o modo import ou live conection.

Aconselho utilizar o DQ apenas quando não houver solução.

https://learn.microsoft.com/en-us/power-bi/guidance/directquery-model-guidance


Caso essa resposta tenha te ajudado, consegue marcar como correta?

 

Link para o comentário
Compartilhar em outros sites

  • 1
  • Alunos

Bom dia @gustavofill;

Quando você aplica a RLS por meio de funções ou ao logar como um usuário específico, o Power BI gera consultas DAX mais complexas para filtrar os dados com base nas regras de segurança definidas, que é diferente de você aplicar um filtro no segmentador. 

Vale ressaltar também que pela demora significativa, acredito que o seu filtro RLS esteja sendo aplicado na tabela Fato, o que gera uma perda de performance ainda maior. Abaixo um teste que fiz em uma base de 6 milhões de linhas, comparando o desempenho: Sem filtro X RLS nas dimensões X RLS na tabela fato.

image.png.2e341e69edd264377d368785183b7d3c.png

 

O RLS gera perda de performance quando aplicado, porém, é muito pior se aplicado nas tabelas Fatos. Abaixo um link da documentação da Microsoft que fala sobre isso e pode te ajudar em uma solução:

https://learn.microsoft.com/pt-br/power-bi/guidance/rls-guidance

image.png.e97046eade1bef7908771bc8f439bb5c.png

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
2 minutos atrás, paulocesarmlf disse:

Fala meu querido, tudo bem?

Cara a dificuldade ai não é o RLS e sim o funcionamento do próprio direct query.

O direct query vai até o banco e realiza uma "consulta", porque os dados não estão importados dentro do arquivo.

Então cada filtro que você usa, você está aumentando essa consulta (imagina que está fazendo alguns WHEREs no SQL)

Trabalhar com direct query vai diminuir bastante a sua performance, não só com esse filtro mas também com outros (principalmente os que não forem de data)

Tem esse artigo da microsoft que vai te ajudar a melhor a performance, no entanto nunca vai chegar a ser parecido com o modo import ou live conection.

Aconselho utilizar o DQ apenas quando não houver solução.

https://learn.microsoft.com/en-us/power-bi/guidance/directquery-model-guidance


Caso essa resposta tenha te ajudado, consegue marcar como correta?

 

Bom dia, Paulo! Tudo bem?

Obrigado pelo comentario.

A questão aqui é que o Direct não é o problema, e sim a RLS.

Quando eu utilizo o DQ, mesmo que com 50-60 usuarios diariamente no meu banco, raramente uma consulta leva mais de 1 segundo para retornar os dados, não tenho nenhum problema com relação a isso.

O problema é quando utilizo a FUNCÃO do RLS aliado ao Direct Query.

Como você pode ver, quando eu utilizo a RLS como FILTRO, não tenho problema algum. Agora se eu utilizo a RLS como funcão, leva um tempo absurdamente maior, trazendo o mesmo resultado.

É sobre isso que eu gostaria de um auxilio.

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
7 minutos atrás, Erick Oliveira disse:

Bom dia @gustavofill;

Quando você aplica a RLS por meio de funções ou ao logar como um usuário específico, o Power BI gera consultas DAX mais complexas para filtrar os dados com base nas regras de segurança definidas, que é diferente de você aplicar um filtro no segmentador. 

Vale ressaltar também que pela demora significativa, acredito que o seu filtro RLS esteja sendo aplicado na tabela Fato, o que gera uma perda de performance ainda maior. Abaixo um teste que fiz em uma base de 6 milhões de linhas, comparando o desempenho: Sem filtro X RLS nas dimensões X RLS na tabela fato.

image.png.2e341e69edd264377d368785183b7d3c.png

 

O RLS gera perda de performance quando aplicado, porém, é muito pior se aplicado nas tabelas Fatos. Abaixo um link da documentação da Microsoft que fala sobre isso e pode te ajudar em uma solução:

https://learn.microsoft.com/pt-br/power-bi/guidance/rls-guidance

image.png.e97046eade1bef7908771bc8f439bb5c.png

Bom dia Erick! Beleza?

Muito obrigado pelo comentario e tempo.

O meu RLS é aplicado na dimensão, nunca utilizei diretamente na fato.

E o que eu acho estranho e foi o que comentei na minha outra resposta ao Paulo, é o fato de que quando aplicado via FILTRO, o resultado é satisfatorio. Agora quando aplicado via funcão(que traz exatamente o mesmo resultado), o tempo é absurdamente maior.

E isso é o que esta me intrigando e não acho uma forma de resolver.

Estou ate pensando em fazer paineis diferentes com pré-filtros para cada gerencia da empresa. O problema é administrar as alterações. Mas resolveria 90% dos problemas. Neste caso eu removeria o RLS e colocaria o filtro em todas as paginas, distribuindo o relatorio em seus respectivos leitores.

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
20 minutos atrás, gustavofill disse:

Bom dia, Paulo! Tudo bem?

Obrigado pelo comentario.

A questão aqui é que o Direct não é o problema, e sim a RLS.

Quando eu utilizo o DQ, mesmo que com 50-60 usuarios diariamente no meu banco, raramente uma consulta leva mais de 1 segundo para retornar os dados, não tenho nenhum problema com relação a isso.

O problema é quando utilizo a FUNCÃO do RLS aliado ao Direct Query.

Como você pode ver, quando eu utilizo a RLS como FILTRO, não tenho problema algum. Agora se eu utilizo a RLS como funcão, leva um tempo absurdamente maior, trazendo o mesmo resultado.

É sobre isso que eu gostaria de um auxilio.

Eu entendi mano, mas essa é a questão RLS + DQ no Power BI não vai te dar uma boa performance. Ainda mais se tu tiver usando um conjunto de dados grande ou se as regras de segurança for complexa (que acredito que não seja, provavelmente só email do usuário né?)

O que tu pode trabalhar é em soluções paralelas para melhorar a performance tipo:
1. Otimizar as consultas DAX
2. Ter uma indexação adequada para suportar os filtros de RLS
3. Simplificar a regra do RLS caso seja complexa
4. Revisar o modelo de dados pra ver se ele ta estruturado de forma a otimizar o desempenho (ver se está em star scheema, no maximo snow flake)
5. Ativar o caching para melhorar as consultas do DQ

Seria importante analisar a estrutura das consultas geradas, a complexidade das regras RLS e a configuração do ambiente de banco de dados. A resolução do problema pode passar pela simplificação das regras de RLS, melhoria na estrutura do modelo de dados, ou até mesmo ajustes na configuração do servidor onde a base de dados reside.

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...