2011-07-08 12 views
1

信頼できるSQL Serverドライバのために純粋に.Net/C#コンソールアプリケーションとして書かれた小さなユーティリティスクリプトがあります.SQLサーバーDBでは70,000を超えるレコードが本質的に反復され、Linq Projection JObjectを呼び出し、JsonオブジェクトをHTTP経由でNoSQLデータベースに送信します。SQL Server上でExecuteReaderはどれほど怠惰ですか?

var command = sqlConnection.CreateCommand(); 
      command.CommandText = "SELECT * FROM MotherFckinBigTable"; 
      var reader = command.ExecuteReader(); 

      int loopCount = 0; 
      while(reader.Read()) { 
// convert reader to JSON object 
// stringify json object 
// webclient uploaddata to couchdb 

} 
} 

私は戻って行くか、またはスキップする必要はありませんので、そのシンプルなスタートを反復処理を終了する、私はここでページングを使用していませんでしたか、LINQのかLLBLGen等。が、私はこの深刻な眉をひそめていると思いまして、レビューされればDBAは心臓発作を起こすでしょうか?あるいは、このシナリオではそれは受け入れられますか?これを念頭に置いてユーティリティスクリプトを作成してください。

答えて

0

ほとんどの場合、できるだけ早くデータベース接続を閉じることを目指すべきです。私はあなたの質問にあまりにも多くの間違いがあるとは言いません(それが目的に合っていると仮定します)。しかし、データベース接続を開いたままにしている間は、処理の量に問題があります。ドメインオブジェクトの処理をキューまたは別のスレッドに送信することによって、データベース接続の有効期間を最小限に保つために、ユーティリティをリファクタリングすることを検討することをお勧めします。

using (var command = sqlConnection.CreateCommand()) 
{ 
    // Use specific column names and the table schema to improve query execution speed. 
    // Use the NoLock if phantom reads are not going to be a business issue. 
    command.CommandText = "SELECT [ColumnName], [ColumnName] FROM [Schema].[TableName] WITH (NOLOCK) "; 
    var reader = command.ExecuteReader(); 

    while(reader.Read()) { 
     // Set properties on domain object (or use AutoMapper) - and don't forget to use a try/catch/finally if it is needed. 
     // Asynchronously send the domain object onto queue or another thread which will convert to Json and send to CouchDb. 
    } 
} 

あなた、次のようなものを使用することをお勧めします

関連する問題