1

Linq to SQL でストアド プロシージャ呼び出しを実行するのに 4 分以上かかるときはいつでも、TimeoutException をスローしようとしています。

これが私のコントローラーのコードです:

public IEnumerable<Quality> Get(DateTime param1, DateTime param2, string param3)
        {     

            var dc = new VideoDataContext(WebApplication.MonitorServer);

            dc.CommandTimeout = 240;

            List<Quality> cqs = dc.Vid_GetQualityForVideo(param1, param2, 
            param3).ToList();


            return cqs;
        }

何らかの理由で、コードは 4 分より長く (ずっと長く) 実行されますが、タイムアウト例外はスローされません。最後に、非常に大きなクエリに対してメモリ例外が発生します。

ストアド プロシージャにアクセスできないため、クエリを最適化することも表示することもできません。アプリケーションでタイムアウトしか検出できません。TimeoutException が発生しない理由を知っている人はいますか。

私のコードの他の場所では、非常によく似たコードがあり、別のデータベースを保持している別のサーバーで 4 分後にタイムアウトがスローされます。ここでは起こっていません。

データ チームに何かを変更するように依頼することはできますが、具体的に何が問題なのかを教えてください。

ありがとう!

編集:明確にするために、データを取得する前に見たのは永遠にかかり、それがクライアントに渡される大量のデータであることに気付きました。行数を検出する MVC アクション フィルターがあり、それが特定のしきい値 (現在は 10000) を超えている場合は、データセット全体ではなく、エラー メッセージのみをクライアントに渡します。私が実行しているクエリは、しきい値をはるかに超えて返されますが、完了するまでに 4 分以上かかります。

4

2 に答える 2

1

クエリが大きい.ToList()場合、パフォーマンスの問題が発生する可能性があります。IEnumerable<T>クエリから取得した は遅延評価されます。ただし、 a を呼び出すと.ToList()、結果の内容全体が繰り返され、結果のList( cqs) に入れられます。

関数の戻り値が本当に欲しい場合はIEnumerable<Quality>、クエリを返すだけでよい場合がありますIEnumerable

public IEnumerable<Quality> Get(DateTime param1, DateTime param2, string param3)
    {     

        var dc = new VideoDataContext(WebApplication.MonitorServer);

        dc.CommandTimeout = 240;

        return dc.Vid_GetQualityForVideo(param1, param2, param3);
    }

編集:

明確にするために、タイムアウトフローではなくメモリフローを取得している場合、IEnumerable を評価すると、反復cqsと同じくらい速くメモリがいっぱいになると思われます。IEnumerableLINQ クエリ (Filterなど) を使用して、結果のIEnumerable.

また(コメントで思い出しました)、タイムアウトが発生しない理由は、dc.Vid_GetQualityForVideo(param1, param2, param3)正常に評価されるためです。返されたときに次のようにToList()呼び出されると、オーバーフローが発生します。いくつかの基本的なブレークポイント チェックを実行すると、これが確認されます。

于 2013-11-04T20:38:52.977 に答える