1

ストアド プロシージャの結果を返すために 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 としてではなく、すべてのデータを一度にダンプしてしまうことだと思いました。

4

3 に答える 3

0

私にとっての解決策は、昔ながらの ADO.NET を使用してストアド プロシージャをクエリすることでした。明らかに L2S ほど簡単ではありませんが、この場合は L2S と同様に指数関数的に高速で、各行に対して手順を実行するようです。

public List<object> Foo(SqlConnection connection)
{
    var query = "[dbo].[FooBar]";
    var command = new SqlCommand(query, connection);
    command.CommandType = CommandType.StoredProcedure;
    connection.Open();

    var reader = command.ExecuteReader();
    var results = new List<object>(); // Or whatever type your data is.

    while (reader.Read())
    {
        // Make this work for your particular data structure:
        results.Add(reader.GetString(0));
    }

    connection.Close();

    return results;
}

また、念のため、必ず using ステートメントを使用して接続を作成してください。

using (var connection = new SqlConnection(connectionString))
{
    results = Foo(connection);
}

ReportGenerator.PivotTable(results);
ReportGenerator.Chart(results);
//etc.
于 2014-05-05T22:56:06.753 に答える
0

レコードを取得している時点で TOList() を実行してみてください。これは高速に動作する可能性があります。 var query = dbml.FooBar(OneParam, TwoParam, ThreeParam).Tolist();コレクションを直接使用する

 ReportGenerator.PivotTable(query);
 ReportGenerator.Chart(query);
于 2013-05-02T05:09:30.673 に答える