web-dev-qa-db-ja.com

データ移動のため、NOLOCKでスキャンを続行できませんでした

SQL Server 2000を実行していると、これらのエラーのいくつかが毎晩発生します。

Could not continue scan with NOLOCK due to data movement

このエラーをスローするクエリは、1ダース以上のテーブルを結合する大きく複雑なクエリです。基礎となるデータは頻繁に更新できます。

文化的な「ベストプラクティス」は、過去にNOLOCKを導入すると、パフォーマンスが向上し、同時実行性が向上することを示唆しています。このクエリは100%正確である必要はありません。つまり、ダーティリードなどを許容します。しかし、これらすべてのロックヒントがあるにもかかわらず、データベースがこのエラーをスローする理由を理解するのに苦労しています。

誰もがこれにいくつかの光を当てることができます-穏やかに、私は実際にはプログラマーであり、DBAではありません:)

PS:以前に下記の修正を適用しました: http://support.Microsoft.com/kb/815008

10
Ciaran Archer

これは、SQL Server 2000でかなりよく知られている問題です。基本的に、プロセスBがスキャンを実行しているときに、プロセスAによって行が削除された場合に発生します(_READ UNCOMMITTED_またはWITH (NOLOCK))。 、次にプロセスBは、データBを読み取ろうとしたときに「このデータに何が起こったのか」を調べます。より正確には、行はプロセスBがインデックスを読み取った後、データ行を読み取ろうとする前に削除する必要があります。

Craig Freedmanがここに書いています

幸い、修正は比較的簡単です: http://support.Microsoft.com/kb/815008

それでもうまくいかない場合は、WITH (NOLOCK)ヒントをすべて削除し、トランザクション分離レベルを_READ UNCOMMITTED_を超える値に設定するという、少し痛いオプションがあります。

7
Simon Righarts