Как принудительно перекомпилировать план выполнения запроса Linq to SQL?

StackOverflow https://stackoverflow.com/questions/2423271

Вопрос

У меня есть запрос 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 (перекомпилировать)" перед выполнением.У меня это работает.Это очень хороший способ решить эту проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top