NOLOCK
一部の大規模なジョブで、「データの移動が原因でスキャンを続行できませんでした」というメッセージが時々表示さWITH (NOLOCK)
れます。これは、選択クエリで実行されます。
これは、ページ分割があり、データが本来あるべき場所でなくなったときにデータを選択しようとすることと関係があることを理解しています。それが私の環境で起こっていることだと思います。
これをどのように再現しますか?
短期的な回避策を講じてエラーをキャッチし、これが発生したときに再試行しようとしていますが、再現できない場合はテストできません。これを引き起こす合理的に信頼できる方法はありますか?
それが発生した場合、クエリを再度実行すると成功します。そのため、実際のデータやデータベースが永続的に破損する心配はありません。クエリ内の一部のテーブル(およびそのインデックス)は、頻繁に削除、再作成、および再設定されるため、これに関連していると想定しています。
削除NOLOCK
は、私が対処する長期的な問題です。NOLOCK
そもそもそこに置かれた理由は、クエリが非常に悪いため、日常のトランザクションでデッドロックが発生しNOLOCK
、デッドロックを阻止するためのバンドエイドが機能したためです(機能しました)。ですから、永久的な解決策ができるまで、私はバンドエイドの上にバンドエイドを必要としています。
Hello Worldでそれを再現できれば、おそらく1時間もかからずにバンドエイドを仕事に投入する予定です。検索と置換の削除を実行できませんNOLOCK
。これは、アプリのデッドロックが再び発生し始めるためです。
コミットされた読み取りスナップショット分離を使用することは良い可能性です。詳細については、データベースチームと協力する必要があります。私たちの問題の一部は、そのようなことを処理するSQL Serverの専門家がいないことです。また、現時点でその変更を行うのに十分な分離レベルを理解していません。
DEADLOCK_PRIORITY
しLOW
て、デッドロックが発生した場合に、アプリケーションではなくジョブが失敗するようにすることができます。その後、デッドロックを調査し、それらが発生している理由を見つけ、その問題を修正することができます。2つのステートメントの順序を入れ替えるなど、非常に単純な修正である可能性があります。問題が何であれ、それは解決策でNOLOCK
はないので、それが最も簡単であるという理由だけでそれを強制しようとするのをやめます。
NOLOCK
これらのジョブから単に削除することを検討しましたか?これらのクエリの結果が正確であると想定されている場合は、601があなたの心配の中で最も少ないはずです。ポール・ホワイトは、ここではあり得ないはずのデータの読み取りの特にひどい例を示しています。