gpt4 book ai didi

c# - Entity Framework 两个查询结果相同,但一个更快

转载 作者:行者123 更新时间:2023-11-30 17:59:28 25 4
gpt4 key购买 nike

我最近在 Entity Framework 查询 SQL Server 2008 时遇到性能问题。我设法解决了这个问题,但我不明白为什么我的修复有效。我使用带有 .Contains() 方法的 Guid 集合在 SQL 中生成 IN 子句。这是原始代码(更改表名以保护无辜者):

Guid[] values = filter.Split(',').Select<String, Guid>(d => new Guid(d)).ToArray();


returnValue = returnValue.Where(t => values.Contains(t.WorkItem.Requirement.Project.ProjectId));

当项目 ID 超过 150 个时,执行此查询大约需要 20 秒。通过更改 .Contains() 的位置,我可以显着加快速度。这是重构:

Guid[] values = filter.FilterValue.Split(',').Select<String, Guid>(d => new Guid(d)).ToArray();

var projects = from p in context.DC_DEF_Project
where values.Contains(p.ProjectId)
select p;

returnValue = from t in returnValue
join p in projects on t.DC_DEF_ProjectWorkItem.DC_DEF_ProjectRequirement.ProjectId equals p.ProjectId
select t;

此代码在与上述查询相同的数据集上花费大约 0.125 秒。

我确信这有一个合理的理由,但我的好奇心正在扼杀我。这是什么?

最佳答案

我的猜测是,在所有连接之后,第一个会导致 sql 中有一堆或 OR 根据工作项上的外键进行评估,其中第二个通过它的主键将 mach 连接到项目并仅评估 150 个 ID,然后连接到其他表。

关于c# - Entity Framework 两个查询结果相同,但一个更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11196113/

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