【发布时间】:2013-05-01 23:37:46
【问题描述】:
我正在使用 Linq2Sql 来返回存储过程的结果。 sproc 在 2 秒内提供 100,000 条记录。应用 ToList() 需要 2 分钟以上。
该项目是一个 ASP.NET WebForm。在代码隐藏中,我试图从事务系统中获取记录,以对仪表板类型的报告应用各种分析。 10 万条记录是平均一个月的数据量。使用较小的数据一切正常。
using (FooDataContext dbml = new FooDataContext())
{
var query = dbml.FooBar(OneParam, TwoParam, ThreeParam);
//no delay
var results = query.ToList();
//takes over 2 minutes -- consistent network traffic throughout
ReportGenerator.PivotTable(results);
ReportGenerator.Chart(results);
//etc.
}
我使用 ToList() 来利用 Linq 的水合 sproc 对象,这些对象对于使用 lambda 表达式评估结果非常方便。
但是 ToList() 需要非常非常长的时间来为这么多数据构建每个结果。如果我在那段时间暂停该过程,我可以看到它只是一遍又一遍地循环通过 sproc 的构造函数。查看我的网络流量似乎可以确认每个对象的代码都将返回到数据库。将 DeferredLoadingEnabled 设置为 false 没有帮助。
有趣的是,我认为存储过程的一个缺点是它们会立即将所有数据转储给您,而不是作为 IQueryable?
【问题讨论】:
-
我不认为框架可以延迟加载存储过程结果。每条记录有多大?
-
存储过程在 LINQ 之外运行需要多长时间?
-
"sproc 在 2 秒内提供 100,000 条记录" 在什么情况下?通过 SSMS 或其他查询工具运行时?
FooBar返回什么类型?该类型的构造函数是否在做任何可能减慢速度的事情? -
如果您的网络流量持续不断,实际上可能需要很长时间才能通过网络传输 100,000 行的所有记录数据。
标签: c# asp.net sql-server-2008 linq-to-sql stored-procedures