【问题标题】:Profiling Entity Framework Core using SQL Server Profiler使用 SQL Server Profiler 分析 Entity Framework Core
【发布时间】:2018-09-02 19:28:27
【问题描述】:

当您在分析 Entity Framework LINQ 语句时查看 SQL Server Profiler 时,会触发很多事件。为了优化 LINQ 查询,我应该在分析器中监控哪些事件?

我认为SQL:BatchCompletedRPC:Completed 是实际执行的查询,但有什么区别?

【问题讨论】:

  • 那么您想知道 1) 它为您生成的语句和 2) 他们的查询计划是什么。说实话,我不知道单独使用 LINQ 可以实际优化多少,但是给你一个或两个的事件将是我开始的地方
  • @Xedni SQL:BatchCompleted 和 RPC:Completed 有什么区别?我应该担心 SQL:BatchCompleted 查询吗?

标签: sql-server query-optimization sql-server-profiler


【解决方案1】:

我认为 SQL:BatchCompleted 和 RPC:Completed 是实际的 执行的查询有什么区别?

SQL:BatchCompleted 事件表示一个或多个语句的临时(未参数化)批次已完成执行。 RPC:Completed completed 事件在远程过程调用请求完成执行时触发,可以是参数化 SQL 语句或直接存储过程调用。

EF 使用 SqlClient API 执行参数化查询。 SqlClient 使用特殊的sp_executesql 存储过程来执行参数化查询,这样就出现在跟踪中。 Profiler 将反序列化的请求显示为 exec sp_executesql N'...,包括文本形式的参数值。实际参数以本机(二进制)格式发送到 SQL。

这些事件与捕获登录、注销的其他事件一起包含在标准 Profiler 跟踪模板中。请注意,当您看到审计注销、“sp_reset_connection”和审计登录的事件序列时,这些事件发生在第一个查询在重用的池连接上执行并且由后续 RPC 为您在跟踪中看到的同一会话触发时。这些都是服务器端内部的,而不是客户端发送的单独请求的结果。

编辑:

我看到您的问题中有一个查询优化标签。要对问题查询的性能进行故障排除,您可以使用带有查看实际执行计划选项的 SQL Server Management Studio 执行捕获的请求。您还可以通过添加Showplan XML 事件来捕获跟踪中的计划,但应该只在具有过滤跟踪的开发框上执行此操作,以避免开销和影响生产工作负载。生产中未过滤的配置文件跟踪是错误的。

【讨论】:

  • 如果在从客户端应用程序运行查询时看到一组 SQL:BatchCompleted 事件被执行,我是否应该担心优化性能?我看到很少有 SQL:BatchCompleted 事件与选择语句没有任何 Where 子句。
  • 这取决于为什么没有 where 子句。如果它正在为下拉列表加载 Country 实体,这是可以预期的(尽管可能应该缓存以供以后使用)。但是,如果是由于错误的 LINQ 表达式在客户端上过滤的较大结果,则需要进行调查。
【解决方案2】:

RPC:Completed 是远程过程调用的完成,这意味着存储过程是从外部应用程序调用的。在您的情况下,EF Core 正在调用 sp_executesql 存储过程来执行从 LINQ 查询生成的 SQL。

SQL:BatchCompleted 表示已经执行了一组 SQL 语句。它可以是一组 DDL 或 DML 语句,也可以是存储过程调用。

【讨论】:

  • 如果在从客户端应用程序运行查询时看到一组 SQL:BatchCompleted 事件被执行,我是否应该担心优化性能?我看到很少有 SQL:BatchCompleted 事件与选择语句没有任何 Where 子句。
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2018-04-12
相关资源
最近更新 更多