【问题标题】:EF Core overhead?EF Core 开销?
【发布时间】:2018-12-07 15:13:28
【问题描述】:

我有一个在 SqlLite 上运行的代码优先 EF Core 代码库,其中一个实体大约有 20 列和 10 行。一个页面在这样的代码中请求这个实体:

var start = DateTime.Now;
var entA = await _context.entA.FromSql("SELECT * FROM entA "+
    "where (Name like '%_Demo' or EXISTS(SELECT NULL FROM entB WHERE StudyId = entA.ID and email = @email)) AND IsDeleted = 0 "+
    "order by colC COLLATE NOCASE",
            new SqliteParameter("@email", User.Identity.Name)) 
    .ToListAsync();
log.Info($"User {User.Identity.Name} requested entA, in {DateTime.Now.Subtract(start).TotalMilliseconds}");

我打开了 EF Core 日志记录,我看到了带有

的查询
Executed DbCommand (2ms) [Parameters=[@email='?'], CommandType='Text', CommandTimeout='30']

但是在日志中(即使在多次运行之后)我看到了

2018-06-28 15:16:49,442 INFO Controller - User user@domain.com requested entA, in 166,0095 

大约 160 毫秒未用于执行查询的时间发生了什么?

更新:正如 Xanatos 所建议的,我已经删除了 await 和 async,幸运的是我看到的数字或多或少是相同的

INFO Controller - User user@domain.com requested entA, in 207,0118 
INFO Controller - User user@domain.com requested entA, in 164,0094 
INFO Controller - User user@domain.com requested entA, in 225,0129 
INFO Controller - User user@domain.com requested entA, in 180,0103 

如果 .net 在返回任务结果之前等待 100 毫秒,那将是非常可悲的

编辑:我发现关闭跟踪会大大加快只读查询的速度:

_context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

【问题讨论】:

标签: c# .net sqlite entity-framework-core


【解决方案1】:

您正在使用await。不能严格保证在数据“准备好”的那一刻,await 会继续。如果要进行测量,请删除 await 并将 ToListAsync() 更改为 ToList()。然后我们可以谈谈基准。

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 2020-03-29
    • 2020-12-08
    • 1970-01-01
    • 2022-01-09
    • 2021-11-23
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多