我正在调用一个返回650行左右的简单存储过程。有几个连接,这个过程大约需要5-6秒。没问题。
然而,列举结果大约需要一分钟才能完成。
using (var context = new DBContext())
{
var results = context.GetResults(param); //5-6 seconds
var resultList = results.ToList(); //1 minute+
}我不常使用实体框架,但这似乎不正常。我做错了什么吗?有什么能让我加快速度的吗?这个表很大,但是按照我的阅读方式,这段代码应该只枚举650个结果.这根本不用花时间。
注意:不确定这是否相关,但从该表中选择所有行所需的时间大致相同(大约一分钟)。
发布于 2014-12-11 21:19:36
解决我的问题的方法是通过创建输入参数的副本来禁用参数嗅探。
alter procedure dbo.procedure
@param int
as
begin
set nocount on;
declare @paramCopy int
set @paramCopy = @param
...发布于 2014-12-11 20:29:18
根据你最近的编辑,我知道发生了什么。我认为,.GetResults()调用只是利用延迟执行,使查询准备就绪即可运行。只有当您在下一行中调用.ToList()时,它才会实际运行并试图构建实体本身(因此产生了时间差)。
那为什么要花这么长时间才能装载呢?这可能是出于若干原因,包括:
DbContext跟踪。这就产生了内存消耗的。您可能需要考虑打开它(但并不是每个人都喜欢启用延迟加载)。AsNoTracking,就像在这篇博客文章中一样。这应该会减少负载时间。.Select()之前使用.ToList())来获取所需的内容。https://stackoverflow.com/questions/27430860
复制相似问题