我有一个动态创建的LINQ to SQL查询。有趣的是,当我在SQL Management Studio中运行时,它的速度很快。当我从L2S运行它时,它会在一段时间后变得非常缓慢。
这可能是因为查询计划/执行计划。当我重新启动SQL Server时,L2S查询也会再次闪电般快速。
现在使用T-SQL,您可以拥有WITH RECOMPILE。但是如何用L2S做到这一点?
答案 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(重新编译)”的末尾添加。它对我有用。如何解决它是非常好的解决方法。