3

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

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

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

4

5 回答 5

5

正如我在下面的线程中发现的,您可以使用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));
于 2012-06-06T17:07:39.323 回答
2

从您描述的行为来看,您的统计数据几乎可以肯定已经过时了。

我建议你重建它们:

exec sp_MSForeachTable 'UPDATE STATISTICS ?'
于 2010-03-11T07:43:05.887 回答
0

查看CompiledQuery类。这是Microsoft 提供的更详细的教程。

于 2010-03-11T07:35:57.507 回答
0

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

于 2016-04-29T21:33:56.890 回答
-1

;) 你没有。辛普。没有暴露。

但动态查询不应该需要“重新编译”。查询慢时检查管理工作室中的查询....所有用户共享执行路径。

难道不是 SQL Server 慢吗?但是 LINQ(即客户端处理)?

您运行的查询是什么?

于 2010-03-11T07:37:15.910 回答