我有一个运行在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在返回Task的结果之前等待100毫秒,那将非常可悲
编辑:我发现对于只读查询,关闭跟踪功能可以大大提高速度:
_context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
答案 0 :(得分:1)
您正在使用QGraphicsView
。不能严格保证在数据“就绪”的瞬间await
会继续。如果要进行测量,请删除await
并在await
中更改ToListAsync()
。然后我们可以谈论基准。