gpt4 book ai didi

c# - EF vs SQL 奇怪的慢

转载 作者:可可西里 更新时间:2023-11-01 08:48:39 26 4
gpt4 key购买 nike

在大量多线程的情况下,我遇到了特定 EF 查询的问题。它通常便宜且快速:

Context.MyEntity
.Any(se => se.SameEntity.Field == someValue
&& se.AnotherEntity.Field == anotherValue
&& se.SimpleField == simpleValue
// few more simple predicates with fields on the main entity
);

这编译成一个非常合理的 SQL 查询:

SELECT 
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM (SELECT [Extent1].[Field1] AS [Field1]
FROM [dbo].[MyEntity] AS [Extent1]
INNER JOIN [dbo].[SameEntity] AS [Extent2] ON [Extent1].[SameEntity_Id] = [Extent2].[Id]
WHERE (N'123' = [Extent2].[SimpleField]) AND (123 = [Extent1].[AnotherEntity_Id]) AND -- further simple predicates here -- ) AS [Filter1]
INNER JOIN [dbo].[AnotherEntity] AS [Extent3] ON [Filter1].[AnotherEntity_Id1] = [Extent3].[Id]
WHERE N'123' = [Extent3].[SimpleField]
)) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]

一般来说,查询具有最佳查询计划,使用正确的索引并在几十个毫秒内返回,这是完全可以接受的。

但是,当临界数量的线程 (<=40) 开始执行此查询时,其性能会下降到数十

数据库中没有锁,没有查询将数据写入这些表,并且它可以很好地重现与几乎与任何其他操作隔离的数据库。数据库驻留在同一台物理机器上, 机器在任何时候都没有过载,即有大量空闲的 CPU、内存和其他资源 CPU 因该操作而过载 .

现在真正奇怪的是,当我用复制粘贴的 SQL(也使用参数),问题神奇地消失了。同样,这种重现非常可靠 - 用复制粘贴的 SQL 替换 Any() 调用可将性能提高 2-3 个数量级


附加的探查器 (dotTrace) 采样显示线程似乎都在以下方法中花费时间:

dotTrace sample

有没有我遗漏了什么或者我们是否遇到了一些 ADO.NET/SQL Server cornercase?


更多上下文

运行此查询的代码是一个 Hangfire 作业。出于测试目的,脚本将许多要执行的作业排队,最多 40 个线程继续处理该作业。每个作业都使用一个单独的 DbContext 实例,并且实际上并没有被大量使用。在有问题的查询之前和之后还有一些查询,它们需要花费预期的时间来执行。

我们出于类似目的使用了许多不同的 Hangfire 作业,它们的行为符合预期。与此相同,除非它在高并发(完全相同的作业)下变慢。此外,只需在这个特定查询上切换到 SQL 即可解决问题。

上面的分析快照具有代表性,所有线程在这个特定的方法调用上都变慢了,并将大部分时间花在了上面。


更新

我目前正在重新运行大量这些检查以确保完整性和错误。 easy 复制意味着它仍在远程计算机上,我无法使用 VS 连接到该计算机进行调试。

其中一项检查表明我之前关于可用 CPU 的说法是错误的,CPU 并没有完全过载,但实际上在长时间运行的作业的整个持续时间内,多个内核都在满负荷运行。

再次重新检查所有内容,并会在此处返回更新。

最佳答案

你能不能像下面这样试一下,看看有没有性能提升...

Context.MyEntity.AsNoTracking()
.Any(se => se.SameEntity.Field == someValue
&& se.AnotherEntity.Field == anotherValue
&& se.SimpleField == simpleValue
);

关于c# - EF vs SQL 奇怪的慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39296336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com