如何强制重新编译Linq的执行计划到SQL查询?

时间:2010-03-11 07:32:16

标签: sql-server linq-to-sql sql-execution-plan

我有一个动态创建的LINQ to SQL查询。有趣的是,当我在SQL Management Studio中运行时,它的速度很快。当我从L2S运行它时,它会在一段时间后变得非常缓慢。

这可能是因为查询计划/执行计划。当我重新启动SQL Server时,L2S查询也会再次闪电般快速。

现在使用T-SQL,您可以拥有WITH RECOMPILE。但是如何用L2S做到这一点?

5 个答案:

答案 0 :(得分:4)

正如我在下面的主题中找到的那样,您可以使用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));

答案 1 :(得分:2)

根据您描述的行为,您的统计信息几乎肯定已过时。

我建议你重建它们:

exec sp_MSForeachTable 'UPDATE STATISTICS ?'

答案 2 :(得分:0)

查看CompiledQuery课程。这是来自Microsoft的tutorial,它更详细。

答案 3 :(得分:0)

;)你不。 Simlpe。没曝光。

但动态查询不需要“WITH RECOMPILE”。管理工作室中的查询很慢......所有用户共享执行路径。

可能是SQL Server不是很慢吗?但是LINQ(即客户端处理)?

您运行的查询是什么?

答案 4 :(得分:0)

我在执行之前使用此EF 6 Parameter Sniffing在SQL命令“option(重新编译)”的末尾添加。它对我有用。如何解决它是非常好的解决方法。