Como forçar recompilação de plano de execução de uma consulta Linq para SQL?
-
19-09-2019 - |
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?
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.
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.