A execução da mesma solicitação do C # VS SSMS fornece tempo de execução diferente

12

Eu tenho um pedido como este

SELECT 
[EstimateId], 
[CreationUserId], 
[EstimateStatusValueId], 
[LanguageId], 
[LocationId], 
[EstimatorUserId], 
[FilterUnitSystemTypeId], 
[EstimateNumber], 
[RevisionNumber], 
[CreationDate], 
[ModificationDate], 
[ProjectDescription], 
[IsBsdq], 
[ClosingDate], 
[ClosingTime], 
[ClosingUpdatedOn], 
[DeadLineDate], 
[IsReceived], 
[Inclusion], 
[Exclusion], 
[Misc], 
[Note], 
[WorkDeadLines], 
[Comments], 
[Validity], 
[PlansLocation], 
[PlansReceivedFrom], 
[Price]
FROM [Estimate].[Estimates] 
ORDER BY [ClosingDate] ASC, [ClosingTime] ASC

Quando executo essa consulta no SSMS, obtenho um tempo de execução de 953ms, mas quando executo essa consulta em uma Consulta Linq no meu C # recebo um tempo de execução de 1813ms.

A consulta Linq usa o ".Net SqlClient Data Provider" e é emitida no EntityFramework (arquivo EDMX). Isso pode ser um problema?

Alguém sabe por que eu tenho uma grande diferença entre os tempos de execução das solicitações iguais, mas executadas em diferentes contextos no mesmo banco de dados?

Eu verifiquei todos os planos de execução de ambos os pedidos e eles usam o mesmo índice para satisfazer suas respectivas consultas.

Para ver o plano de execução da solicitação C #, uso o criador de perfil SQL para interceptar o evento Show Plan XML e comparo-o ao do SSMS e ambos são iguais.

Nico
fonte
apenas uma pequena pergunta - por que você está selecionando todos os dados da tabela sem nenhuma condição de pesquisa? Você realmente precisa de todos os dados no aplicativo sem filtragem?
Marian
Sim, este é um recurso que eu preciso, mas esse recurso não será usado com frequência. Eu sei que não é ideal emitir uma grande consulta sem a cláusula where.
Nico
De qualquer forma, minha preocupação não é a solicitação em si, mas a diferença entre os tempos de execução. Eu mostro essa consulta, mas todas as consultas fornecem resultados semelhantes. Por quê ?
Nico

Respostas:

6

Isso é consistente, vez após vez?

Vejo uma diferença de CPU que pode ser tempo de compilação. Existem configurações de LINQ que afetam isso?

Editar:

  • Capturar os planos no Profiler
  • Você tem certeza de que o SQL é o mesmo no Profiler ?
gbn
fonte
Sim, é consistente vez após vez. Eu não sei para configurações linq. mas encontrei este link codeproject.com/KB/cs/linqsql2.aspx
Nico
Você pode ver o plano na figura acima para as duas consultas. Sim, tenho certeza que o SQL é o mesmo no criador de perfil. SQL, Profiler, SSMS e aplicativo C # estão todos hospedados no meu computador para fins de desenvolvimento.
Nico
Capture o plano real em XML do Profiler. Não do cache. Você tem respostas diferentes, mas mostra um plano diferente = plano errado mostrado acima, talvez
gbn
3

Você deseja examinar os planos de execução para as duas consultas e ver onde elas são diferentes.

mrdenny
fonte
Acabei de editar minha postagem ... e já verifiquei se as duas consultas usam o mesmo plano.
Nico
1
Acabei de adicionar o evento que você me contou ao profiler e é o mesmo que o meu último pedido que eu postei na minha pergunta. Eu tenho os mesmos planos .. qualquer outra ideia ...
Nico
2
Tudo parece correto. A única coisa que pode explicar isso seria se o aplicativo .NET não receber os dados com rapidez suficiente. O tempo relatado no SQL Profiler inclui a quantidade de tempo para transferir os dados do servidor para o cliente. Portanto, se o cliente não baixar tudo rápido o suficiente, o tempo de execução relatado será maior.
mrdenny
2
Então, tudo se resume ao que o aplicativo está fazendo com os dados e como ele está lendo os dados no banco de dados.
mrdenny
3
Em apoio à resposta de mrdenny, eu acrescentaria que testei uma consulta em três clientes SQL diferentes e os tempos relatados foram todos diferentes, embora as estatísticas e execução da IO e os planos sejam idênticos. Tudo foi causado pela maneira interna de como os clientes trataram os dados. Acredito que você pode obter resultados de tempo diferentes enviando para um arquivo, para a grade no Management Studio ou para a saída de texto. Enfim, pelo que me lembro, a documentação dizia que o SQL sempre será mais rápido que o LINQ to SQL, então isso não é uma surpresa :-).
Marian