【问题标题】:FindAsync is Slow, but lazy loading is fastFindAsync 很慢,但延迟加载很快
【发布时间】:2016-02-09 12:37:07
【问题描述】:

在我的代码中,我曾经使用 await FindAsync 加载相关实体,希望我能更好地符合 c# 异步准则。

var activeTemplate = await exec.DbContext
.FormTemplates.FindAsync(exec.Form.ActiveTemplateId);

它运行缓慢,在 sql server profiler 中很慢,在 SSMS 中查询文本很快。获取此行需要 5 秒。

替代方案:

var activeTemplate = exec.Form.ActiveTemplate;

更快。 无论如何,问题似乎不在于参数嗅探,因为快速和慢速查询中的读取次数是相同的。

一个可能不相关的点是获取的对象包含一个包含约 1MB 文本的字符串属性。应用是asp.net mvc,和sql server在同一台电脑上运行,使用(本地)连接。

观察到的缓慢的原因是什么?

编辑:@jbl 发表评论后,我又做了一些实验:

var activeTemplate = await exec.DbContext.FormTemplates
.FirstOrDefaultAsync(x => x.Id == exec.Form.ActiveTemplateId); // slow

var activeTemplate = exec.DbContext.FormTemplates
.FirstOrDefault(x => x.Id == exec.Form.ActiveTemplateId); // fast

【问题讨论】:

标签: c# sql-server performance entity-framework async-await


【解决方案1】:

从服务器读取大型列(例如 varbinary(MAX)、varchar(MAX)、nvarchar(MAX) 或 XML)时,异步方法可能会出现性能问题。

您可以找到 rducom 答案,该答案解释了异步方法 here

的问题

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多