最終決定を理解することはビジネス上の決定です。SQL 2008 R2 で実行されている NOLOCK と READPAST の間の精度に関する考慮事項は何ですか? 事業領域との変更について話し合う前に、理解を深めたいと思います。
管理レポート用のデータ ビューを作成するために使用される多くのクエリを継承しました。「WITH (NOLOCK)」は自由に使用されますが、一貫性がありません。読み取られるデータは、頻繁に更新される広く使用されているアプリケーションの運用サーバーからのものです。SQL 2005 サーバーから SQL 2008 R2 サーバーに移行しています。これらのレポートは、アーカイブ サーバー上の 24 時間前のデータよりも新しいデータを必要とします。NOLOCK の使用は、過去の決定を示唆しています。競合の可能性があり、多少の精度の低下は許容されます。データは、人間の認識/意思決定のためにダッシュボードに入力するために使用されます。
すべてのクエリは SELECT であり、データ ビューのログインには読み取り専用のアクセス権があります。クエリの大部分は、いくつかの 2 つまたは 3 つのテーブル結合を含む単一のテーブルです。低レベルの結合を考えると、WITH () は SET TRANSACTION ISOLATION LEVEL {} よりも適切な選択のようです。
Table Hints (Transact-SQL) http://msdn.microsoft.com/en-us/library/ms187373.aspx (および SO に関する複数の質問) は、NOLOCK および/または READUNCOMMITTED には重複した読み取りの問題がある可能性が高いと述べています。ロックされたレコードの欠落に加えて。
READPAST は、重複の可能性なしにロックされたレコードのみを見逃すため、より正確に見えます。しかし、ロックされたレコードの欠落のレベルが、それと NOLOCK の間で一貫しているかどうかはわかりません。
この 2 つを比較した Tim Chapman による優れた記事がありますが、これは 2007 年に書かれたものであり、ほとんどのコメントは 2000 年と 2005 年を中心に展開されており、1 つのコメントは 2008 R2 で READPAST に問題があることを示しています
参考文献
SELECT ステートメントでの NOLOCK ヒントの効果
SQL Server での NOLOCK および READPAST テーブル ヒントの使用 (Tim Chapman 著)
編集:
スナップショット分離は、以下の 2 つの回答で提案されています。スナップショット分離は DB の設定に依存します。この Q/A https://serverfault.com/questions/117104/how-can-i-tell-if-snapshot-isolation-is-turned-onは、どの設定を確認するかを説明していますデータベースに配置されています。無効になっていることがわかりました。主要なアプリケーション データベースからのレポートを読んでいます。設定を変更することはオプションではありません。+- 数パーセントの精度は許容できますが、アプリケーション (OLTP) への影響は許容できません。ほとんどの単純なクエリではロックを考慮する必要はありませんが、極端な場合にはロックを考慮する必要があります。SQL 2005 のスナップショット分離の出現により、SQL 2008 以降での NOLOCK および READPAST の動作に関する情報はほとんどありません。それでも、それらは私の唯一の選択肢のままです。