1

セットアップ

特定のテーブルのすべての行を戻すように構成された単純な SQLDataReader があります。

メモリ使用量を比較的低く抑えたいので、SQLDataReader を使用しています。

取得した行ごとに、いくつかのデータに単純な変更を適用し、これをすぐに実行する更新の基礎として使用しています。

このようにして、単純な計算関数をテーブル内のすべてのレコードに適用できます。

いつ機能しますか?

これは私のローカル データベースでは問題なく動作します。また、別のサーバーにあるテスト データベースでも問題なく動作します。

うまくいかないときは?

ライブ データベースのコピーを復元すると、プロセスが正しく実行されず、更新を最初に実行しようとするとタイムアウトが発生します。

何が違うのですか?

LiveBackup と Test の唯一の違いは、その中のレコード数のようです。Test データベースには 4823 のレコードがあり、LiveBackup には 10182 のレコードがあります。

さらに、LiveBackup システムから限られた数 (1000 程度) のレコードを取得するように SQLDataReader に条件を導入すると、すぐに機能し始めます。

理論

なんらかのロックが導入されているようですが、実際のところはわかりません。

単純にレコードを 1000 個のバッチに分割できたことはありがたく思いますが、それでも問題の原因を正確に理解することはできません。

SQLDatareader が多数のレコードをアドレス指定しているときに、(単一のレコードをアドレス指定している) 更新でタイムアウトが発生するのはなぜですか?

4

2 に答える 2

2

SQL Server のページ サイズは 8K なので、1 ページを読み込もうとするとロックが変わるのではないでしょうか?

ここでの Bruce Barker の返信には、状況を回避するためのヒントがいくつか含まれてい ます。

しかし、あなたが指摘したように、行をフェッチしてバッチで更新することは一歩前進です:-)

個人的には、データをローカルで取得して更新する必要がある場合、昔ながらの DataSet/DataTable をバッチで作成し、DataAdapter も使用します。次に、更新をバッチで書き戻すことで、さらに効率を高めることができます: http://msdn.microsoft.com/en-us/library/aadf8fk2​​.aspx

TSQL で更新を行うことは不可能であるとすでに判断しましたか?

于 2012-10-15T10:21:25.487 に答える
1

異なる環境間で異なる分離/行ロックレベルがあるように聞こえます。そのため、異なる動作が得られます(または、SQL Serverは行が多いほど異なる戦略を選択します)。テーブルのすべての行を返すクエリが、ライブデータベースのテーブルをロックしているように見えます。

行ロック動作は次のように設定できます。

(したがって、これはADO.NETに関係する何よりもSQL Serverの質問であることに注意してください)

于 2012-10-15T09:47:30.223 に答える