在我的代码中,我曾经使用加载相关实体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服务器在同一台计算机上运行,使用(本地)连接。
观察到的速度缓慢的原因是什么?
编辑:在 @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
从服务器读取大型列(例如 varbinary(MAX)、varchar(MAX)、nvarchar(MAX) 或 XML)时,异步方法可能会出现性能问题。
你可以找到rducom答案解释了异步方法的问题here https://stackoverflow.com/a/28619983/304832
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)