【问题标题】:Entity Framework SQL Profiler - How to trace back to code that generated SQLEntity Framework SQL Profiler - 如何追溯生成 SQL 的代码
【发布时间】:2014-03-29 06:38:24
【问题描述】:

我们正在使用实体框架 6.0 来开发我们的新应用程序。我们所有的实体查询都是从 DAL 层生成的。对于我们当前部署到生产环境的应用程序,我们使用 SQL 监控工具来跟踪 SQL 查询的性能。

我关心的是如何追踪生成 SQL 的 DAL 类,以便解决实体查询的性能问题。我从该工具中获得的只是实体框架生成的 SQL 查询。

其他人如何跟踪生产中的 SQL 查询问题?我知道我可以使用 Glimpse,但是如果您只有原始 SQL,您如何跟踪生成 SQL 的实体框架查询?我尝试使用谓词构建器添加一个虚拟 where 子句,以查看它是否会出现在 SQL 中,但它被忽略了。喜欢

  predicate = predicate.Or(u => "methodName" == "methodName");

感谢您的帮助。

【问题讨论】:

    标签: entity-framework data-access-layer


    【解决方案1】:

    您可以使用 New Relic 来检测应用程序和 SQL。他们有一个称为“关键事务”的功能,它可以告诉你慢速事务(实际上是为 Web 请求设置的,但理论上你可以让它适用于其他类型的应用程序),并允许你查看这些事务中的慢速 SQL 查询.

    为了将您的数据访问层添加到被检测的方法中,您可以按照https://docs.newrelic.com/docs/dotnet/dotnet-agent-custom-metrics 编辑检测 xml 文件

    请注意,关键交易功能包含在高级附加功能中,需要付费。您确实可以免费获得一段时间,因此可能值得一看,看看它是否为您提供了足够的价值。

    (顺便说一句,我与 New Relic 没有任何关系。)

    【讨论】:

    • 谢谢。但我真的很想寻找一种方法来追踪从源代码生成 SQL 的位置。我将拥有的唯一内容是 SQL 查询的性能配置文件。当我们发现查询需要很长时间时,我们需要找出生成 sql 的实体查询。我想知道其他人在发现性能不佳的查询时在做什么。
    • 我认为很难从 SQL 反向生成实体查询以便将它们匹配回来,因为不会存在一对一的映射。例如。可以在生成相同 SQL 的实体查询中以多种方式进行字符串比较。我想说大多数人会在代码和 SQL 上使用分析器,因为运行缓慢的查询也会显示为运行缓慢的方法。
    • 谢谢乔希。看来我将不得不花一些时间研究可以在生产中运行的源代码分析器。
    【解决方案2】:

    如果您有一个涵盖生成查询的代码的测试套件,您可以使用它来将生成的 SQL 查询连同生成它们的 DAL 方法一起保存到文件中。您可以使用以下代码 (taken from this SO answer regarding viewing the SQL):

    var result = from x in appEntities
             where x.id = 32
             select x;
    
    var sql = ((System.Data.Objects.ObjectQuery)result).ToTraceString();
    

    如果您以某种结构化方式(例如 CSV)保存了这些查询和方法名称,可能是作为测试运行的副作用,您可以通过在此文件中搜索您从生产中看到的查询来进行反向查找.您可能需要进行一些规范化,例如去掉所有不重要的空白,在这两种情况下都去掉参数分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2012-10-15
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多