在我的代码中,我曾经使用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