FindAsync很慢,但是延迟加载很快。

4

在我的代码中,我曾经使用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相同的计算机上,使用(local)连接。

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

编辑:在@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

2
这应该会有所帮助 https://dev59.com/zGgt5IYBdhLWcg3w-SBM#11688189 - jbl
谢谢,奇怪的是,这不是答案:请看编辑 - Alireza
2
请查看这里的答案,它可能适用于您的情况:https://dev59.com/-V4b5IYBdhLWcg3w61V3 - Jonathan Magnan
1
在异步模式下,带有VARCHAR(MAX)的数据库出现了某些原因导致的缓慢。 - Seb
真的是这样!谢谢。 - Alireza
我会将其发布为答案,以便其他人更容易找到解释。 - Jonathan Magnan
1个回答

4

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

您可以在此处找到rducom的答案,解释了异步方法的问题here


3
你可以在这里投票以解决此问题:https://entityframework.codeplex.com/workitem/2686。 - Seb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接