SqlDataReaderループのテーブルロックを最小限に抑えますか?

.net c# dapper sql-server

質問

私は次のシナリオを持っています(例外処理は削除され、コードは単純化されました)。

SqlDataReader rdr = executeQuery(query);
while (rdr.Read()) {
   //There are thousands of records, so this happens thousands of times
   handleRecord(rdr); //Takes a couple of seconds
}
rdr.Close();

したがって、クエリーに関係するテーブル(混雑したSQL Server 2000上で実行されているテーブル)は、レコードの量に応じて数時間またはそれ以上の時間にわたって共有ロックを持ちます。

これらのロックは、このデータベースを照会する他のアプリケーションに影響を与えることがあるため、できるだけ早くロックを削除するように求められています。

だから、明白ではない

List<Record> rList = new List<Record>();
SqlDataReader rdr = executeQuery(query);
while (rdr.Read()) {
   //There are thousands of records, so this happens thousands of times
   storeRecord(rList,rdr); //Takes milliseconds
}
rdr.Close();
foreach (Record r in rList) {
    handleRecord(r);
}

マシンのメモリ上で扱うことができるレコードの量に制限がありますが、それ以外の方法はありますか?

(このアプリは、Dapper.NETにゆっくりと移行しているので、このシナリオで役立つDapperのものがある場合は、すでにコードの他の部分に依存しています。)

人気のある回答

古いトピックですが、時には私が使うトリックです:

  1. プライマリキーでSQLクエリを注文します。
  2. トップの##レコードを読んでください。
  3. それらの##レコードを読み込み/バッファします。
  4. バッファーを使用して処理を行います。
  5. 最も高いIDを覚えています。

1つの変更で2に戻る:WHERE id>最高のIDの上位の##レコードを読んでいる。

このようにして、データのバッチを読み取り、処理することができます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow