我正在使用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