使用SQL Server Profiler对Entity Framework Core进行性能分析

3
当您在分析Entity Framework LINQ语句时观察SQL Server Profiler,会发现有很多事件被触发。为了优化LINQ查询,应该监视哪些事件?
我发现SQL:BatchCompletedRPC:Completed是实际执行的查询,但它们有什么区别? enter image description here

你想要知道它正在生成哪些语句和它们的查询计划是什么。实话实说,我不知道你可以用LINQ单独进行多少优化,但是能够提供其中任何一种或两种的事件将是我开始的地方。 - Xedni
@Xedni,SQL:BatchCompleted和RPC:Completed之间有什么区别?我需要担心SQL:BatchCompleted查询吗? - Nipuna
2个回答

0

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

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


1
如果我从客户端应用程序运行查询时看到一组SQL:BatchCompleted事件被执行,那么我应该担心优化性能吗?我看到了一些没有任何Where子句的select语句的SQL:BatchCompleted事件。 - Nipuna

0
我发现SQL:BatchCompleted和RPC:Completed是实际执行的查询,但它们有什么区别? SQL:BatchCompleted事件表示一个或多个语句的自由文本(非参数化)批处理完成执行。当远程过程调用请求完成执行时,RPC:Completed完成事件触发,可以是参数化的SQL语句或直接存储过程调用。
EF使用SqlClient API执行参数化查询。 SqlClient使用特殊的sp_executesql存储过程来执行参数化查询,因此在跟踪中显示该存储过程。 Profiler将反序列化的请求显示为exec sp_executesql N'...,包括文本形式的参数值。实际参数以本机(二进制)格式发送到SQL。
这些事件包含在标准的Profiler跟踪模板中,还包括其他捕获登录、注销等事件。请注意,当您看到Audit Logout、'sp_reset_connection`和Audit Login事件序列时,这些事件发生在重用的池连接上执行第一个查询时,并由后续RPC触发同一会话的服务器端内部操作。这些都不是客户端发送的单独请求的结果。

编辑:

我看到你在问题中使用了查询优化标签。为了解决问题查询的性能问题,你可以使用 SQL Server Management Studio 执行一个捕获的请求,并选择查看实际执行计划选项。你也可以通过添加 Showplan XML 事件来捕获计划,但应该只在开发环境中使用带有过滤跟踪的方式来避免影响生产工作负载。在生产环境中使用未经过滤的 Profile 跟踪是不好的。


如果我从客户端应用程序运行查询时看到一组SQL:BatchCompleted事件被执行,那么我应该担心优化性能吗?我看到了一些没有任何Where子句的select语句的SQL:BatchCompleted事件。 - Nipuna
这取决于为什么没有where子句。如果它正在为下拉列表加载国家实体,那是可以预期的(尽管应该缓存以供以后使用)。但是,如果由于错误的LINQ表达式而在客户端上过滤大量结果,则需要进行调查。 - Dan Guzman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接