C# ASP.NET Core 3.1实体框架存在查询持续时间
我试图在ASP.NET Core 3.1 MVC应用程序中评测数据库第一个EF SQL查询,这似乎有点耗费时间 在使用秒表并努力获得我想要的粒度后,因此我安装了MiniProfiler(顺便说一句,如果您没有它,请获取它) 简而言之,函数将接收一个以逗号分隔的零件id字符串,并返回一个工作单基本id的字符串[]C# ASP.NET Core 3.1实体框架存在查询持续时间,c#,sql-server,asp.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,Entity Framework Core,我试图在ASP.NET Core 3.1 MVC应用程序中评测数据库第一个EF SQL查询,这似乎有点耗费时间 在使用秒表并努力获得我想要的粒度后,因此我安装了MiniProfiler(顺便说一句,如果您没有它,请获取它) 简而言之,函数将接收一个以逗号分隔的零件id字符串,并返回一个工作单基本id的字符串[] string[] part_array = part.Split(','); string[] base_id_array = { }; using (MiniProfiler.Cur
string[] part_array = part.Split(',');
string[] base_id_array = { };
using (MiniProfiler.Current.Step("TestDB"))
{
using (DB_Access.AccessContext db_context = new DB_Access.AccessContext())
{
var query = from a in db_context.WorkOrder.AsNoTracking()
where part_array.Contains(a.User2)
select new
{
a.BaseId
};
if (query != null)
{
if (query.Any())
{
foreach (var item in query)
{
Array.Resize(ref base_id_array, base_id_array.Length + 1);
base_id_array[base_id_array.GetUpperBound(0)] = item.BaseId;
}
}
}
}
}
MiniProfiler显示以下内容:
因此,第一个EF执行一个EXIST查询,需要147.7ms
然后EF关闭连接,重新打开,并执行实际的SELECT查询,这只需要40.4ms
我想问题有三个方面
if (query.Any())
这将导致您的第一个查询。首先具体化查询并使用结果:
var queryResults = (from a in db_context.WorkOrder.AsNoTracking()
where part_array.Contains(a.User2)
select new
{
a.BaseId
})
.ToList();
foreach (var item in queryResults)
{
Array.Resize(ref base_id_array, base_id_array.Length + 1);
base_id_array[base_id_array.GetUpperBound(0)] = item.BaseId;
}
您不需要null
检查(因为您正在为变量分配局部变量,ToList
如果在数据库中找不到结果,则返回空值)和Any
(foreach
将为您处理)
为什么查询要花这么长时间
MiniProfiler似乎没有说查询在数据库端需要多长时间,而是说需要多长时间
ExecuteReader
。我将假设这是一个只运行一次的测试代码,因此由于JIT编译,它可能需要很长时间(比select更长),而后续调用所需的时间更少,因为JIT编译已经为它执行过。但我建议使用数据库探查器检查查询。数据库有多大?返回了多少数据?尝试使用语句切换这两个选项。