A consulta é lenta para determinados usuários

11

Tenho algumas consultas chamadas de um aplicativo Web C # .NET que são sempre rápidas para mim (eu sou um administrador local no SQL Server), mas para um grupo de usuários (grupo de domínio com permissões necessárias), a consulta é incrivelmente lenta para o ponto de tempo limite no aplicativo.

O que faria com que exatamente a mesma consulta fosse executada de maneira diferente para usuários diferentes?

Mais informações:

  • A consulta é SQL embutido no código C #, não um procedimento armazenado
  • O aplicativo usa autenticação de domínio e o usuário e eu executamos a consulta pelo aplicativo
  • Parece que o problema é de planos diferentes e um foi armazenado em cache; é por isso que foi diferente para usuários diferentes. Algo está afetando o cache, porque agora a consulta é lenta para mim por meio do aplicativo e rápida no SQL Server Management Studio.
Supergibbs
fonte
2
Verifique as seguintes perguntas . Você pode achar que está na mesma situação. Digamos que primeiro tente este e este outro .
Marian
3
Quais são os tipos de espera (sys.dm_os_waiting_tasks) nas consultas lentas e também quais são os planos de execução reais de cada um (seu rápido, seu lento)?
22613 Thomas Thomas Stringer
2
Concorde com os comentários anteriores. Meu primeiro pensamento também seria farejar parâmetros. Verificar se os planos são diferentes deve ser o primeiro passo.
Martin Smith
4
Se os parâmetros forem os mesmos (suponho que seja para isso exact same query), não deve ser o sniffing de parâmetros (os usuários obtêm um plano ruim para o (s) parâmetro (s) errado (s)), mas os usuários estão recebendo planos diferentes para o mesmo parâmetro (s) Pode ser por causa de configurações como quoted_identifiere arithabort, que você pode comparar sys.dm_exec_sessionspara o usuário rápido e o usuário lento, ou porque eles têm esquemas padrão diferentes e objetos são referenciados sem o prefixo do esquema. A detecção de parâmetros ainda pode estar envolvida (daí o motivo de um deles ter um plano ruim).
Aaron Bertrand
1
RE: Sua edição você tem o mesmo esquema padrão dos outros usuários? Você já capturou os planos de execução para execuções lentas e rápidas?
Martin Smith

Respostas:

5

Se os parâmetros forem os mesmos (suponho que seja para isso exact same query), não deve ser o sniffing de parâmetros (os usuários obtêm um plano ruim para o (s) parâmetro (s) errado (s)), mas os usuários estão recebendo planos diferentes para o mesmo parâmetro (s) Pode ser por causa de configurações como quoted_identifiere arithabort, que você pode comparar sys.dm_exec_sessionspara o usuário rápido e o usuário lento, ou porque eles têm esquemas padrão diferentes e objetos são referenciados sem o prefixo do esquema. A detecção de parâmetros ainda pode estar envolvida (daí o motivo de um deles ter um plano ruim).

Aaron Bertrand
fonte
3

Eu vi duas razões para isso: 1, parâmetro sniffing 2, as configurações de conexão são diferentes. Se você executar o whoisactive , ele mostrará as diferentes propriedades da conexão. Na verdade, tenho um post sobre isso, mas não limpei as informações específicas da empresa. (nem habilitei meu blog ainda);)

rottengeek
fonte
0

Tente: Especifique o esquema em todas as referências de tabela e EXEC. Por exemplo, EXEC dbo.MyProc

Pode haver conflitos (como sugere Martin Smith - 'mesmo esquema padrão'?) Ou recompilar

Kip Bryan
fonte
0

Isso parece ser um erro no SQL Server. Sinto esse erro com o SQL Server 2008. Não testei novas versões. Posso fazer login como administrador, executar esta consulta e obter uma resposta em 0 segundos:

select ROUTINE_NAME from INFORMATION_SCHEMA.ROUTINES ORDER BY ROUTINE_NAME

Depois, efetuo login como um usuário com menos permissões, executo exatamente a mesma consulta e a resposta leva 45 segundos.

Isso é consistente repetidamente. Se eu alternar entre minhas duas janelas de consulta, uma para o administrador e outra para o não administrador, o não administrador sempre leva cerca de 45 segundos e o administrador leva 0 segundos.

Rob Kraft
fonte
Conforme solicitado nos comentários da pergunta - os dois usuários têm o mesmo banco de dados padrão e as consultas estão sendo executadas no mesmo banco de dados? E, você pode apontar para algum tipo de documentação que afirma que isso é um bug ou é sua opinião? Não estou dizendo que você está errado, apenas procurando algo além de uma anedota.
RDFozz 3/07
O problema que você identificou na sua resposta parece não ser repetível no SQL Server 2008. select ROUTINE_NAME from INFORMATION_SCHEMA.ROUTINES ORDER BY ROUTINE_NAMERetorna dados imediatamente de forma consistente para um logon não-SA que não possui direitos garantidos explicitamente.
Max Vernon