Как принудительно перекомпилировать план выполнения запроса Linq to SQL? - PullRequest
3 голосов
/ 11 марта 2010

У меня есть запрос LINQ to SQL, который создается динамически. Самое смешное, что когда я запускаю его в SQL Management Studio, это молниеносно. Когда я запускаю его из L2S, через некоторое время он становится ужасно медленным.

Это, вероятно, из-за плана запроса / плана выполнения. Когда я перезапускаю SQL Server, запрос L2S также снова работает молниеносно.

Теперь с T-SQL вы можете использовать WITH RECOMPILE. Но как это сделать с L2S?

Ответы [ 5 ]

4 голосов
/ 06 июня 2012

Как я нашел в теме ниже, вы можете использовать DataContext.GetCommand(IQueryable), чтобы получить DbCommand для запроса, который вы хотите выполнить. Вы можете добавить «OPTION (RECOMPILE)» к тексту команды, из этого открыть читатель и использовать [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));
2 голосов
/ 11 марта 2010

Исходя из описанного вами поведения, ваша статистика почти наверняка устарела.

Я предлагаю вам восстановить их:

exec sp_MSForeachTable 'UPDATE STATISTICS ?'
0 голосов
/ 30 апреля 2016

Я использовал это EF 6 Параметр Sniffing для добавления в конце команд SQL "option (перекомпилировать)" перед выполнением. Это работает для меня. Это очень хороший способ ее решения.

0 голосов
/ 11 марта 2010

;) Вы не. Simlpe. Не подвергается.

Но динамические запросы не должны нуждаться в "WITH RECOMPILE". Проверьте запрос в Management Studio, когда он медленный .... все пользователи имеют общие пути выполнения.

Может быть, не SQL Server работает медленно? Но LINQ (то есть обработка на стороне клиента)?

Какой запрос вы запускаете?

0 голосов
/ 11 марта 2010

Проверьте класс CompiledQuery . Вот учебник от Microsoft, который еще более детален.

...