Как принудительно перекомпилировать план выполнения запроса Linq to SQL?
-
19-09-2019 - |
Вопрос
У меня есть запрос LINQ to SQL, который создается динамически.Забавно, что когда я запускаю его в SQL Management Studio, это происходит молниеносно.Когда я запускаю его из L2S, через некоторое время он становится ужасно медленным.
Вероятно, это связано с планом запроса / планом выполнения.Когда я перезапускаю SQL Server, запрос L2S также снова выполняется молниеносно.
Теперь с T-SQL вы можете иметь возможность ПЕРЕКОМПИЛИРОВАТЬ.Но как это сделать с L2S?
Решение
Как я обнаружил в приведенной ниже теме, вы можете использовать DataContext.GetCommand(IQueryable)
чтобы получить DbCommand
для запроса, который вы хотите выполнить.Вы можете добавить "OPTION (ПЕРЕКОМПИЛИРОВАТЬ)" к тексту команды, после чего открыть программу чтения и использовать [DataContext.Translate<T>
]1 чтобы перевести открытое средство чтения в нужный вам тип объекта.
http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/def80609-eaf2-4631-8d3d-ad10fc9aedfa
Например, учитывая 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));
Другие советы
Судя по поведению, которое вы описываете, ваша статистика почти наверняка устарела.
Я предлагаю вам восстановить их заново:
exec sp_MSForeachTable 'UPDATE STATISTICS ?'
Ознакомьтесь с Скомпилированный запрос класс.Вот такой Учебник от Microsoft, которая вдается в еще более подробные сведения.
;) ты этого не делаешь.Просто.Не разоблаченный.
Но динамические запросы не должны нуждаться в "С ПЕРЕКОМПИЛЯЦИЕЙ".Проверьте запрос в management Studio, если он выполняется медленно....все пользователи совместно используют пути выполнения.
Может быть, дело не в том, что SQL Server работает медленно?Но LINQ (т.е.обработка на стороне клиента)?
Какой запрос вы выполняете?
Я использовал это Обнюхивание параметров EF 6 добавить в конце SQL-команд "option (перекомпилировать)" перед выполнением.У меня это работает.Это очень хороший способ решить эту проблему.