2017-11-21 2 views
4

私はこのような考えを持っています(悪いことや良いことは知らない)。 私はreglamentによってSQLサーバに接続し、アプリケーションにデータを取り込むユーティリティを持っています。データは単純です(2つのvarcharテキスト属性)が、データ数は約3百万行です。だから、私のアプリケーションは非常に集中的にネットワークを使います。 SQL DataReaderによってネットワーク帯域幅の使用量をプログラムで制限(制限、調整など)することはできますか?よりゆっくりと動作させますが、サーバーやクライアントのどちらにも負荷をかけないようにしてください。このアイデアは良いですか?そうでなければ、私は何をしなければなりませんか?ここでSQL DataReaderのネットワーク使用制限

は、これまでのコード、次のとおりです。

using (SqlConnection con = new SqlConnection("My connection string here")) 
{ 
    con.Open(); 
    using (SqlCommand command = new SqlCommand(query, con)) 
    {       
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       yield return new MyDBObject() 
       {        
        Date = (DateTime)reader["close_date"],         
        JsonResult = (string)reader["json_result"] 
       }; 
      } 
     } 
    } 
} 
+1

はい - データ・リーダーを使用すると、クライアント側のすべてのデータをマテリアライズする必要なく、大きなデータ・セットを遅延評価することができます。データアクセスでasync/awaitを使用する場合は、yield returnジェネレータを別の関数(またはおそらくローカル関数)に移動する必要があります。 [Example here](https://stackoverflow.com/a/47376646/314291) – StuartLC

+1

クライアントで効果的に調整することはできません。そうするならば、サーバー側のロックとバッファーを保持し、行を生成できないスレッドをブロックするだけです - たとえ "動作"しても、帯域幅を減らすという意味で、サーバーの待機統計はスパイクは、ASYNC_NETWORK_IOの待ち時間が多い心配のあるDBAから注目を集めることができます。呼び出しごとにフェッチするデータ量を減らして、他のクエリのための余地を残しても、できるだけ早くフェッチしているデータを常に処理できます。 –

答えて

4

は、サーバーのバッファデータを作るか、実際にが大幅にサーバー上負荷を増大させる可能性が長く開いてクエリを保持するが、最終的に何を行うための唯一の方法あなたあなたの質問に「ページング」を適用し、ページ間のポーズを含む連続したページのデータにアクセスすることです。ページはかなり大きいかもしれません - 例えば100k。これはSQL ServerのOFFSET/FETCHで比較的簡単に実現できます。