Pergunta

Eu tenho uma consulta LINQ to SQL que é criado dinamicamente. O engraçado é que, quando eu executá-lo em um raio de SQL Management Studio-lo rapidamente. Quando eu executá-lo de L2S torna-se awefully lento depois de um tempo.

Este é provavelmente por causa do plano de consulta de plano / execução. Quando eu reiniciar o SQL Server a consulta L2S é também muito rápido novamente.

Agora, com T-SQL que você pode ter com RECOMPILE. Mas como fazer isso com L2S?

Foi útil?

Solução

Como eu encontrei no tópico abaixo, você pode usar o DataContext.GetCommand(IQueryable) para obter um DbCommand para a consulta que pretende executar. Você pode adicionar "OPTION (RECOMPILE)" para o texto de comando, a partir disso, abra um leitor, e uso [DataContext.Translate<T>] 1 para traduzir o leitor aberto para o tipo de entidade que você queria.

http: / /social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/def80609-eaf2-4631-8d3d-ad10fc9aedfa

Por exemplo, dado um DataContext dataContext:

IQueryable<string> exampleItemsQuery = dataContext.Table.Where(…).Select(…); //etc

DbCommand command = dataContext.GetCommand(exampleItemsQuery);
command.CommandText += Environment.NewLine + "OPTION (RECOMPILE)";
if (dataContext.Connection.State != ConnectionState.Open)
   dataContext.Connection.Open();

IEnumerable<string> exampleItems = dataContext.Translate<string>(command.ExecuteReader(CommandBehavior.CloseConnection));

Outras dicas

A partir do comportamento que você descreve, suas estatísticas são quase certamente fora da data.

Eu sugiro que você reconstruí-los:

exec sp_MSForeachTable 'UPDATE STATISTICS ?'

Confira a classe CompiledQuery . Aqui está um tutorial da Microsoft que vai para mesmo mais detalhes.

;) você não. Simlpe. Não exposto.

Mas consultas dinâmicas não deve precisar de uma "WITH RECOMPILE". Verifique a consulta no estúdio de gestão quando é lenta .... todos os caminhos de execução utilizadores ação.

Será que não é o SQL Server que é lento? Mas LINQ (ou seja, a manipulação do lado do cliente)? ??

O que é a consulta que você corre?

Eu usei esse EF 6 Parâmetro Sniffing para adicionar no final do comandos SQL "opção (recompilação)" antes de executar. Ele funciona para mim. É muito boa solução como resolvê-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top