セットアップ
特定のテーブルのすべての行を戻すように構成された単純な SQLDataReader があります。
メモリ使用量を比較的低く抑えたいので、SQLDataReader を使用しています。
取得した行ごとに、いくつかのデータに単純な変更を適用し、これをすぐに実行する更新の基礎として使用しています。
このようにして、単純な計算関数をテーブル内のすべてのレコードに適用できます。
いつ機能しますか?
これは私のローカル データベースでは問題なく動作します。また、別のサーバーにあるテスト データベースでも問題なく動作します。
うまくいかないときは?
ライブ データベースのコピーを復元すると、プロセスが正しく実行されず、更新を最初に実行しようとするとタイムアウトが発生します。
何が違うのですか?
LiveBackup と Test の唯一の違いは、その中のレコード数のようです。Test データベースには 4823 のレコードがあり、LiveBackup には 10182 のレコードがあります。
さらに、LiveBackup システムから限られた数 (1000 程度) のレコードを取得するように SQLDataReader に条件を導入すると、すぐに機能し始めます。
理論
なんらかのロックが導入されているようですが、実際のところはわかりません。
単純にレコードを 1000 個のバッチに分割できたことはありがたく思いますが、それでも問題の原因を正確に理解することはできません。
SQLDatareader が多数のレコードをアドレス指定しているときに、(単一のレコードをアドレス指定している) 更新でタイムアウトが発生するのはなぜですか?