SQL Server 2000を実行していると、これらのエラーのいくつかが毎晩発生します。
Could not continue scan with NOLOCK due to data movement
このエラーをスローするクエリは、1ダース以上のテーブルを結合する大きく複雑なクエリです。基礎となるデータは頻繁に更新できます。
文化的な「ベストプラクティス」は、過去にNOLOCK
を導入すると、パフォーマンスが向上し、同時実行性が向上することを示唆しています。このクエリは100%正確である必要はありません。つまり、ダーティリードなどを許容します。しかし、これらすべてのロックヒントがあるにもかかわらず、データベースがこのエラーをスローする理由を理解するのに苦労しています。
誰もがこれにいくつかの光を当てることができます-穏やかに、私は実際にはプログラマーであり、DBAではありません:)
PS:以前に下記の修正を適用しました: http://support.Microsoft.com/kb/815008
これは、SQL Server 2000でかなりよく知られている問題です。基本的に、プロセスBがスキャンを実行しているときに、プロセスAによって行が削除された場合に発生します(_READ UNCOMMITTED
_またはWITH (NOLOCK)
)。 、次にプロセスBは、データBを読み取ろうとしたときに「このデータに何が起こったのか」を調べます。より正確には、行はプロセスBがインデックスを読み取った後、データ行を読み取ろうとする前に削除する必要があります。
幸い、修正は比較的簡単です: http://support.Microsoft.com/kb/815008
それでもうまくいかない場合は、WITH (NOLOCK)
ヒントをすべて削除し、トランザクション分離レベルを_READ UNCOMMITTED
_を超える値に設定するという、少し痛いオプションがあります。