gpt4 book ai didi

c# - Entity Framework 查询 super 慢

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

我正在从日志表中读取记录。该表目前有 260,000 条记录,8 列。这是通过 EF6 的代码。

using (var ctx = new DbEntities())
{
ctx.Configuration.ProxyCreationEnabled = false;
ctx.Configuration.AutoDetectChangesEnabled = false;
ctx.Configuration.LazyLoadingEnabled = false;
Stopwatch sw = Stopwatch.StartNew();
var k = ctx.Logs.Where(l => l.ApplicationId == id && l.Level <= 3 && (l.Dat == 20160514 ||l.Dat == 20160513 ) ).ToList();
sw.Stop();
}

以上代码需要 7-8 秒才能返回 2213 行。在不到一秒的时间内在 SSMS 故事上运行等效项。

我也试过运行查询

ctx.Logs.SqlQuery("SELECT * FROM Log WITH(NOLOCK) WHERE ApplicationId = 4 and Level <= 3 and (Dat = 20160513 or Dat = 20160514)").AsNoTracking().ToList();

这也需要大约 7 秒

我有 2 个非聚集键,一个是 ApplicationId DESC,另一个是 ApplicationId DESC、Dat DESC、Level ASC。

事件监视器从不显示数据库的负载。

对于这种规模的查询来说,这似乎需要很长时间。还是我的期望有偏差?

谁能看出我做错了什么?

注意* Sql 位于具有 4 个内核和 8gb 内存的 Azure VM 上,其中它获得 3gb

注意*我现在知道我不应该调用我的列 Level

编辑

以下来自EF6 Log

SELECT 
[Extent1].[LogId] AS [LogId],
[Extent1].[ApplicationId] AS [ApplicationId],
[Extent1].[Type] AS [Type],
[Extent1].[Source] AS [Source],
[Extent1].[Message] AS [Message],
[Extent1].[LogTime] AS [LogTime],
[Extent1].[Level] AS [Level],
[Extent1].[Dat] AS [Dat]
FROM [dbo].[Log] AS [Extent1]
WHERE ([Extent1].[ApplicationId] = @p__linq__0) AND ([Extent1].[Level] <= 3) AND ([Extent1].[Dat] IN (20160514,20160513))
-- p__linq__0: '2648' (Type = Int32, IsNullable = false)
-- Executing at 5/14/2016 8:38:38 PM -04:00
-- Completed in 101 ms with result: SqlDataReader

看起来查询速度相当快。那么为什么 ToList() 这么慢?

最佳答案

EF 必须将 SQL 的结果映射到对象中,这可能涉及映射器的反射和动态加载,以将 SQL 结果转换为 logs 列表。如果您对单个结果进行计时,请尝试在同一上下文中多次执行同一件事。您会发现每个结果的执行时间会减少。这是因为映射器已经加载,不需要检索。

我不是 EF 的专家,我只是试验了同样的问题,发现几秒的延迟只是针对上下文的第一次执行的问题。

关于c# - Entity Framework 查询 super 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37233233/

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