ストアド プロシージャの結果を返すために Linq2Sql を使用しています。sproc は 2 秒未満で 100,000 レコードを提供します。ToList() の適用には 2 分以上かかります。
プロジェクトは ASP.NET WebForm です。コード ビハインドでは、トランザクション システムからレコードを取得して、ダッシュボード タイプのレポートにさまざまな分析を適用しようとしています。100K レコードは、平均 1 か月分のデータです。より小さなデータですべてが正常に機能します。
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 オブジェクトを利用しました。これは、ラムダ式で結果を評価するのに便利です。
しかし、ToList() は、この大量のデータの各結果を構築するのに非常に長い時間がかかります。その間にプロセスを一時停止すると、sproc のコンストラクターを何度もループしているだけであることがわかります。ネットワーク トラフィックを見ると、オブジェクトごとにコードがデータベースに戻っていることが確認できます。DeferredLoadingEnabled を false に設定しても役に立ちませんでした。
おもしろいことに、ストアド プロシージャの欠点は、IQueryable としてではなく、すべてのデータを一度にダンプしてしまうことだと思いました。