代码之家  ›  专栏  ›  技术社区  ›  Dennis van der Stelt

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

  •  3
  • Dennis van der Stelt  · 技术社区  · 14 年前

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

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

    现在,使用T-SQL,您可以使用重新编译。但是如何使用L2呢?

    5 回复  |  直到 6 年前
        1
  •  4
  •   Mark Sowul    6 年前

    正如我在下面的线索中发现的,您可以使用 DataContext.GetCommand(IQueryable) 得到一个 DbCommand 对于要执行的查询。您可以将“选项(重新编译)”添加到命令文本中,从中打开读卡器,然后使用 [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
  •  2
  •   Mitch Wheat    14 年前

    从你描述的行为来看,你的统计数据几乎肯定是过时的。

    我建议你重建它们:

    exec sp_MSForeachTable 'UPDATE STATISTICS ?'
    
        3
  •  0
  •   Gregory Higley    14 年前

    退房 CompiledQuery 类。这是一个 tutorial 更详细的信息。

        4
  •  0
  •   TomTom    14 年前

    你不知道。Simlpe。不暴露。

    但是动态查询不需要“with recompile”。当查询速度较慢时,请检查Management Studio中的查询….所有用户共享执行路径。

    可能不是因为SQL Server太慢了吗?但是LINQ(即客户端处理)?

    您运行的查询是什么?

        5
  •  0
  •   Community c0D3l0g1c    7 年前

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