1. ホーム
  2. sql

[解決済み】SELECT文におけるNOLOCKヒントの効果について

2022-04-21 21:11:27

質問

本当のところはどうなんでしょうね。

ダーティーリードを気にしないのであれば で、(NOLOCK) のヒントは、SELECT文のパフォーマンスに影響を与えます。

  1. 現在のSELECT文
  2. その他の取引は、与えられたテーブルに対して

Select * 
from aTable with (NOLOCK)

どのように解決するのですか?

1) はい でセレクトします。 NOLOCK は、通常のセレクトよりも高速に完了します。

2) はい で選択すると NOLOCK を使用すると、影響を受けるテーブルに対する他のクエリが、通常のセレクトよりも高速に完了します。

なぜそうなるのでしょうか?

NOLOCK 通常(DBエンジンにもよるが)、データを渡してくれれば、それがどんな状態であろうと気にしないし、読み込むときにわざわざ静止させる必要もない、という意味だ。これは同時に、より速く、より少ないリソース消費で、非常に危険なことなのです。

システムクリティカルなもの、絶対的な正しさが要求されるものは NOLOCK を読み取ります。このデータには、クエリの実行中に削除された行や、まだ確定していない他のセッションで削除された行が含まれている可能性が絶対にあります。このデータには、部分的に更新された行が含まれている可能性があります。このデータには外部キー制約に違反するレコードが含まれている可能性があります。このデータには、テーブルに追加されたものの、まだコミットされていない行が含まれていない可能性があります。

データの状態を知る方法が本当にないのです。

もし、Row Countなどのサマリーデータのように、ある程度の誤差が許容されるようなものを取得しようとしているのなら NOLOCK は、これらのクエリのパフォーマンスを向上させ、データベースのパフォーマンスに悪影響を与えないようにするための良い方法です。

常に NOLOCK ヒントが返すデータには十分な注意を払い、怪しんで扱うようにしましょう。