为啥 EF Core 2.0 会生成多个重复的 SQL 语句?

Posted

技术标签:

【中文标题】为啥 EF Core 2.0 会生成多个重复的 SQL 语句?【英文标题】:Why is EF Core 2.0 generating multiple duplicate SQL statements?为什么 EF Core 2.0 会生成多个重复的 SQL 语句? 【发布时间】:2022-01-13 14:33:16 【问题描述】:

我在其服务层中继承了一个带有 Entity Framework Core 2.0 的项目。我从来都不是 EF 的粉丝,所以我根本没有使用它。在尝试为客户端调试性能问题时,我打开了详细日志记录,这样我就可以看到 EF 在幕后生成的所有 SQL。当我查看这些日志时,我看到相同的 SQL 语句连续出现了好几次。例如,我看到以下查询连续出现六次,作为检索初始用户登录然后获取其相关配置文件信息等方法的一部分:

Microsoft.EntityFrameworkCore.Database.Command: Information: Executed DbCommand (114ms) [Parameters=[@__get_Item_0='1'], CommandType='Text', CommandTimeout='30']
SELECT TOP(1) [e].[Id], [e].[AccountId], [e].[Created], [e].[Email], [e].[Puk], [e].[LastModified], [e].[LastSync], [e].[PasswordHash], [e].[PasswordSalt], [e].[Status], [e].[Type]
FROM [Users] AS [e]
WHERE [e].[Id] = @__get_Item_0

这是准确的吗?它真的像它说的那样执行了 6 次相同的 SQL!? 什么可能导致这种行为? 非常感谢您提供的任何见解。

*注意:@__get_Item_0 参数对于每个查询具有相同的精确值

编辑:添加查询对象上的 LINQ:

query.Include(x => x.UserProfile)
.OrderByDescending(x => x.LastModified)
.Take(resultsCount).ToList(); //resultsCount is set to 30 

【问题讨论】:

"什么可能导致这种行为?"一个循环?多个会话?再次查询而不是重复使用结果的逻辑缺陷?您对这是性能问题的根源有多大把握? SQL Server Management Studio 附带一个内置分析器。使用它。 @DStanley 代码中没有循环可以解释这一点,单步执行它,它只执行一次相关部分。 是否都包含"Information: Executed DbCommand" 还是这部分日志实际上不同? 那么,LINQ 表达式在哪里? 【参考方案1】:

没有。

首先让我说有人在那里使用了一个非常糟糕的版本 - 2.0 太糟糕了,2.1 也好不到哪里去......无论如何......

如果您看到多个这样的重复语句,那么这可能只有两个原因:

跟踪中断并多次显示相同的输出。并不是说我从未见过。 一遍又一遍地重复相同的查询。

Ef Core 不会无缘无故地向服务器多次询问同一个问题。

如果您可以排除 1 - time 添加断点并查看这些多个请求在代码中的来源。

【讨论】:

我没有理由怀疑跟踪不正确。并且通过我没有看到多次执行相同的代码。他们为用户构建的查询虽然有一个 Include(u => u.UserProfile) 和一个 Take(resultCount) 作为其构造的一部分,但这是要研究的吗? 不。构造查询不会执行它。如果您多次看到这种情况发生 - 其中有相同的用户 ID - 那么您有一个跟踪错误,或者代码正在多次执行它。时期。这就像唯一的逻辑解决方案。如果变量不同 -> 则不是同一个查询。 这可能是在各个处理阶段独立执行的查询。我们不知道——这就是调试的用武之地。断点。找出实际执行以太查询的位置。

以上是关于为啥 EF Core 2.0 会生成多个重复的 SQL 语句?的主要内容,如果未能解决你的问题,请参考以下文章

执行迁移 EF core 2.0 时出错,将身份 ID 从字符串更改为 int

EF Core 过滤掉多对多关系中的重复实体

EF Core 2.0中开启Transaction事务会对DbContext创建和关闭数据库连接的行为有所影响

LINQ EF Core 左连接 [重复]

从 EF6 迁移到 EF Core 2.0

为啥我的 ASP.NET Core 3.1 控制器会自动为从视图返回的 EF Core 模型分配 ID?