首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF存储过程结果的枚举

EF存储过程结果的枚举
EN

Stack Overflow用户
提问于 2014-12-11 19:29:05
回答 2查看 203关注 0票数 1

我正在调用一个返回650行左右的简单存储过程。有几个连接,这个过程大约需要5-6秒。没问题。

然而,列举结果大约需要一分钟才能完成。

代码语言:javascript
复制
using (var context = new DBContext())
{
    var results = context.GetResults(param); //5-6 seconds
    var resultList = results.ToList(); //1 minute+
}

我不常使用实体框架,但这似乎不正常。我做错了什么吗?有什么能让我加快速度的吗?这个表很大,但是按照我的阅读方式,这段代码应该只枚举650个结果.这根本不用花时间。

注意:不确定这是否相关,但从该表中选择所有行所需的时间大致相同(大约一分钟)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-11 21:19:36

解决我的问题的方法是通过创建输入参数的副本来禁用参数嗅探。

代码语言:javascript
复制
alter procedure dbo.procedure
    @param int
as
begin
    set nocount on;

    declare @paramCopy int
    set @paramCopy = @param

    ...
票数 1
EN

Stack Overflow用户

发布于 2014-12-11 20:29:18

根据你最近的编辑,我知道发生了什么。我认为,.GetResults()调用只是利用延迟执行,使查询准备就绪即可运行。只有当您在下一行中调用.ToList()时,它才会实际运行并试图构建实体本身(因此产生了时间差)。

那为什么要花这么长时间才能装载呢?这可能是出于若干原因,包括:

  1. 您可能禁用了延迟加载。这将导致所有记录都被完全加载,以及它们各自的导航属性,并且所有这些记录都会被DbContext跟踪。这就产生了内存消耗的。您可能需要考虑打开它(但并不是每个人都喜欢启用延迟加载)。
  2. 您允许跟踪器跟踪所有记录,这占用了内存。相反,如果要获取的数据无论如何都是只读的,那么您可能需要考虑使用AsNoTracking,就像在这篇博客文章中一样。这应该会减少负载时间。
  3. 你可能会抢很多专栏。我不知道您的过程返回了什么,但是如果它是很多行,有很多不同的列,那么所有这些数据都会被塞进内存中,这需要花费很长的时间来处理。相反,您可能需要考虑只根据需要选择尽可能少的列(在调用.Select()之前使用.ToList())来获取所需的内容。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27430860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档