(nolock)を使用してパフォーマンスを向上させます
-
28-10-2019 - |
質問
(nolock)をクエリで使用している開発者を見てきましたが、それの不利な点はありますか?また、クエリのデフォルトの実行モードは何ですか?私のデータベースにはインデックスがありません。
データベースの選択ステートメントパフォーマンスを増やす他の方法はありますか?
解決
Nolockとの一般的な誤解は、実行中にデータベースにロックされないことです。技術的には、スキーマの安定性(SCH-S)ロックを発行するため、ロックの「いいえ」部分はクエリのデータ側に関連しています。
私がこれを見るほとんどの場合、それは開発者がそれを聞いたので、クエリをより速くするので、開発者による時期尚早の最適化です。
汚い読み取りを受け入れる際に証拠と妥当性を計装していない限り(そして同じ行を2回読む可能性があります)、それは使用すべきではありません - それは間違いなくクエリへのデフォルトのアプローチではなく、それが表示できる場合のルールの例外であるべきですそれが必要であること。
他のヒント
ネット上にこれに関する多くの記事があります。主なリスクはそれです NOLOCK
テーブルから未確認のデータを読むことができます(Dirty Reads)。たとえば、 http://msdn.microsoft.com/en-us/library/aa259216(v=sql.80).aspx また http://www.techrepublic.com/article/using-nolock-and-readpast-table-hints-in-scl-server/6185492
NOLOCK
頻繁に使用されるテーブルから古いデータを読んでいる場合、非常に便利です。次の例を考えてみましょう、
非アクティブプロジェクトのデータにアクセスするためのストアドプロシージャがあります。古いデータを読みながら、このストアドプロシージャが頻繁に使用されるプロジェクトテーブルをロックすることを望んでいません。
NOLOCK
また、汚れた読み取りが問題ではなく、次の場合のようにデータが頻繁に変更されない場合にも役立ちます。
国、通貨などのリストを読む...データベースから形式で表示する。ここでは、データは変更されておらず、汚れた読み物は非常にまれに発生するため、大きな問題を引き起こすことはありません。
ただし、SQL Server 2005から始めて、Nolockの利点は行バージョンのためにほとんどありません。