web-dev-qa-db-ja.com

SELECTステートメントにおけるNOLOCKヒントの効果

私は本当の質問だと思います:

ダーティリードを気にしないのであれば、SELECTステートメントにwith(NOLOCK)ヒントを追加すると、以下のパフォーマンスに影響します。

  1. 現在のSELECTステートメント
  2. 与えられたテーブルに対する他のトランザクション

例:

Select * 
from aTable with (NOLOCK)
187
Bob Probst

1)はいNOLOCKname__を使用した選択は、通常の選択よりも早く完了します。

2)はいNOLOCKname__を使用した選択では、影響を受ける表に対する他の照会を通常の選択よりも早く完了できます。

なぜこれだろう?

NOLOCKname__は通常(あなたのDBエンジンに依存します)あなたのデータを私に与えることを意味します、そして私はそれがどのような状態にあるかを気にしません。それは一気に速く、リソースをあまり必要とせず、そして非常に危険です。

システムの重要な部分、またはNOLOCKname__の読み取りから発生したデータを使用して絶対的な正確さが要求される部分から、決して更新を実行したり、システムの重要事項を実行したりしないように注意してください。このデータには、クエリの実行中に削除された行、またはまだ確定していない他のセッションで削除された行が含まれている可能性があります。このデータには、部分的に更新された行が含まれている可能性があります。このデータに外部キー制約に違反するレコードが含まれている可能性があります。このデータは、テーブルに追加されたがまだコミットされていない行を除外することがあります。

あなたは本当にデータの状態が何であるかを知る方法がありません。

Row Countやその他の要約データのように、ある程度の誤差が許容できる範囲でデータを取得しようとしている場合は、NOLOCKname__を使用してこれらのクエリのパフォーマンスを向上させ、データベースのパフォーマンスに悪影響を与えないようにします。

常にNOLOCKname__ヒントを細心の注意を払って使用し、疑わしいところから返されるデータをすべて扱います。

276
tom.dietrich

共有ロックがないため、NOLOCKを使用すると、ほとんどのSELECTステートメントが高速になります。また、ロックの発行がないということは、ライターがSELECTによって妨げられることはないということです。

NOLOCKは、分離レベルのREAD UNCOMMITTEDと機能的に同等です。主な違いは、選択した場合、一部のテーブルではNOLOCKを使用でき、他のテーブルでは使用できないことです。複雑なクエリですべてのテーブルにNOLOCKを使用する予定がある場合は、ヒントをすべてのテーブルに適用する必要がないため、SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDを使用する方が簡単です。

ここにあなたの処分でのすべての分離レベルとテーブルのヒントに関する情報があります。

トランザクション分離レベルの設定

テーブルヒント(Transact-SQL)

59
Pittsburgh DBA

上で述べたことに加えて、nolockは実際にはnotコミットされた行を取得するの前にあなたが選択するというリスクを強いることに注意してください。

http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx を参照してください。 =

13
user806549

ロックを待つ必要がないため、高速になります。

6
StingyJack
  • 待機する必要がないため、現在のSELECTは早く開始されます。

  • 他のトランザクションは新しいトランザクションと処理時間を共有しているため、遅くなります。

使用しないでください。

NOLOCKはデータベースの読み込み速度を上げるための魔法のような方法として悪用されることが多くありますが、可能な限り使用しないようにしています。

結果セットには、まだコミットされていない行、後にロールバックされることが多い行を含めることができます。

エラーまたは結果セットは空の場合も、行が欠落している場合も、同じ行が複数回表示される場合もあります。

これは、読んでいるのと同時に他のトランザクションがデータを移動しているためです。

READ COMMITTEDには、複数のユーザーが同じセルを同時に変更する単一の列内でデータが破損するという追加の問題があります。

他にも副作用があるので、そもそもあなたが望んでいた速度の増加を犠牲にすることになります。

今、あなたは知っています、二度とそれを使用しないでください。

2