gpt4 book ai didi

c# - 为什么 Entity Framework 需要 30 秒来加载记录,而生成的查询只需要 1/2 秒?

转载 作者:可可西里 更新时间:2023-11-01 03:09:14 25 4
gpt4 key购买 nike

下面的 executeTime 第一次是 30 秒,下次执行同一组代码时是 25 秒。在 SQL Profiler 中观察时,我立即看到一个登录,然后它就在那里停留了大约 30 秒。然后,只要运行 select 语句,应用程序就会完成 ToList 命令。当我从 Management Studio 运行生成的查询时,数据库查询只需要大约 400 毫秒。它返回 14 行和 350 列。看起来将数据库结果转换为实体所花费的时间非常短,以至于不明显。

那么在进行数据库调用之前的 30 秒内发生了什么?

如果 Entity Framework 这么慢,我们不可能使用它。有没有我做错了什么或者我可以改变什么来显着加快速度?

更新:好吧,如果我使用编译查询,第一次需要 30 秒,第二次需要 1/4 秒。我可以做些什么来加快第一次通话的速度吗?

using (EntitiesContext context = new EntitiesContext()) 
{
Stopwatch sw = new Stopwatch();
sw.Start();
var groupQuery = (from g in context.Groups.Include("DealContract")
.Include("DealContract.Contracts")
.Include("DealContract.Contracts.AdvertiserAccountType1")
.Include("DealContract.Contracts.ContractItemDetails")
.Include("DealContract.Contracts.Brands")
.Include("DealContract.Contracts.Agencies")
.Include("DealContract.Contracts.AdvertiserAccountType2")
.Include("DealContract.Contracts.ContractProductLinks.Products")
.Include("DealContract.Contracts.ContractPersonnelLinks")
.Include("DealContract.Contracts.ContractSpotOrderTypes")
.Include("DealContract.Contracts.Advertisers")
where g.GroupKey == 6
select g).OfType<Deal>();
sw.Stop();
var queryTime = sw.Elapsed;
sw.Reset();
sw.Start();
var groups = groupQuery.ToList();
sw.Stop();
var executeTime = sw.Elapsed;
}

最佳答案

我遇到了完全相同的问题,我的查询需要 40 秒。

我发现问题出在 .Include("table_name") 函数上。我拥有的越多,情况就越糟。相反,我将我的代码更改为在查询后立即延迟加载我需要的所有数据,这将总时间从 40 秒减少到大约 1.5 秒。据我所知,这完成了完全相同的事情。

所以对于你的代码,它应该是这样的:

var groupQuery = (from g in context.Groups
where g.GroupKey == 6
select g).OfType<Deal>();

var groups = groupQuery.ToList();

foreach (var g in groups)
{
// Assuming Dealcontract is an Object, not a Collection of Objects
g.DealContractReference.Load();
if (g.DealContract != null)
{
foreach (var d in g.DealContract)
{
// If the Reference is to a collection, you can just to a Straight ".Load"
// if it is an object, you call ".Load" on the refence instead like with "g.DealContractReference" above
d.Contracts.Load();
foreach (var c in d.Contracts)
{
c.AdvertiserAccountType1Reference.Load();
// etc....
}
}
}
}

顺便说一句,如果您要在当前代码的查询上方添加这行代码,它会将时间缩短到大约 4-5 秒(我的选择仍然太长)据我了解,MergeOption.NoTracking 选项禁用大量更新和插入内容回数据库的跟踪开销:

context.groups.MergeOption = MergeOption.NoTracking;

关于c# - 为什么 Entity Framework 需要 30 秒来加载记录,而生成的查询只需要 1/2 秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686554/

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