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


10

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

Could not continue scan with NOLOCK due to data movement

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

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

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

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


3
NOLOCKを削除し、クエリ/インデックス/プロセスを修正します。もちろんお手伝いできます... en.wikipedia.org/wiki/Halloween_Problem
gbn

3
@SQLKiwi:ダーティスキャンでのデータ移動の多くの場合、SQL 2012は正常に回復します(割り当て順に次のページに続きます)。
Remus Rusanu

1
@SQLKiwi:はい、まだあります。朗報ですが、ダーティスキャンに基づくカーソルも、これをより適切に処理する必要があります。
Remus Rusanu

回答:


7

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

クレイグ・フリードマンはここに良い記事を書いています

さいわい、修正は比較的簡単です。http//support.microsoft.com/kb/815008

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


その修正は最新です。フラグを適用し、再起動しても、これらのエラーが発生します。
Ciaran Archer、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.