【问题标题】:How to force recompile of execution plan of a Linq to SQL query?如何强制重新编译 Linq to SQL 查询的执行计划?
【发布时间】:2010-03-11 07:32:16
【问题描述】:

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

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

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

【问题讨论】:

  • 在 99% 的情况下,您不需要 WITH RECOMPILE;这通常是您正在治疗的症状,而不是真正的原因......
  • 这是参数嗅探不完善的症状,有时会导致疯狂的决定。如果是程序员的错误,所有的查询都会很慢。

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


【解决方案1】:

正如我在下面的线程中发现的,您可以使用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));

【讨论】:

  • 但是它似乎不适用于某些加载选项。 DataContext.Translate 可能会开始执行另一个 SQL 命令并失败,因为当前命令仍在使用该连接。
  • 我有点明白你在说什么,但是如何做到这一点的一个清晰的例子会很有帮助
【解决方案2】:

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

我建议你重建它们:

exec sp_MSForeachTable 'UPDATE STATISTICS ?'

【讨论】:

    【解决方案3】:

    查看CompiledQuery 课程。这是来自 Microsoft 的 tutorial,其中包含更详细的信息。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        ;) 你不知道。辛普。没有暴露。

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

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

        您运行的查询是什么?

        【讨论】:

        • 查询计划仍将被重用。您可能会遇到与存储过程相同的参数嗅探问题。使用 SSMS 检查可能会导致与您从 L2S 中获得的内容和计划略有不同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        相关资源
        最近更新 更多