我正在使用Linq2Sql来返回存储过程的结果。 sproc在2秒内提供100,000条记录。应用ToList()需要2分钟以上。Linq-to-Sql Sproc - ToList()太慢
该项目是一个ASP.NET WebForm。在代码隐藏方面,我试图从事务性系统获取记录,为仪表板式报告应用各种分析。 100K记录是平均月份的数据。一切工作正常与较小的数据。
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的水合存储过程的对象,这是很方便的用于评估与lambda表达式的结果。
但ToList()需要非常很长的时间来为这些数据构造每个结果。如果我在那段时间暂停过程,我可以看到它只是通过sproc的构造函数循环遍历。看着我的网络流量似乎证实代码将返回到每个对象的数据库。将DeferredLoadingEnabled设置为false并没有帮助。
有趣的是,我认为存储过程的一个缺点是他们一次性将所有数据都转回给你,而不是IQueryable?
我不认为这个框架可以推迟装载存储过程的结果。每个记录有多大? – tia 2013-05-01 23:48:47
存储过程需要多长时间才能在LINQ之外运行? – 2013-05-02 17:07:37
“sproc在2秒内提供100,000条记录”在什么情况下?当通过SSMS或其他查询工具运行时? “FooBar”返回什么类型?那种类型的构造函数是否在做任何可能会减慢速度的东西? – 2013-05-02 17:09:54