【发布时间】: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;
【问题讨论】:
-
编写 linq 查询而不是像这样调用
标签: c# .net sqlite entity-framework-core