X

[SQL Server]SQLServerのNOLOCKロックヒント(ダーティーリードがしたい)

今日はSQLの処理がどこまで進んだか経過を見たい(keyのmax値を取得したい)等の場合、テーブルにロックが掛かってしまい値が取れない時に、ダーティーリードを行う備忘録です。
普段の処理ではあやふやなデータが返ってくるためほとんど使用しません。
そもそもコミット前なので、ロールバックすることも有るし。
で、データの一括修正を行って居て、現在どのへんまで終わったか、全体が終わるのはいつかなどの目安の時間を知るためなどに使用します。

sql文はヒント「NOLOCK」を付けるだけの簡単なものです。
 select * from テーブル名 WITH(NOLOCK)

簡単なテストをシたい場合は、以下のようにすることで確かめられます。
1)まずは、テスト用テーブル作成

create table ##tbl1(
 id int,
 val int 
)

2)次に、SQLの挿入処理・・・時間を稼ぐ為にWAITFOR DELAY 使用

begin tran
  --	delete from ##tbl1
  declare @i int
  set @i=0

  while @i<100
   begin	
    insert into ##tbl1 values(@i,1)
    WAITFOR DELAY '00:00:03'
    set @i=@i+1
   end
commit tran

3)select文の発行
上の挿入SQLと異なるクエリウィンドウを立ち上げてチェック実施
また、下のSQLの個別のクエリウィンドウで確認した方がわかりやすい。

select max(id) from ##tbl1                        --・・・・commit されるまで返って来ない
select max(id) from ##tbl1 WITH(NOLOCK) --・・・・直ぐに返って来る

※)注意
 NOLOCKヒントを付けても、テーブルのスキーマ変更やSQLServerが内部で統計情報を更新するときに発生するスキーマロックが掛かっていると、待たされます。
 なので、必ず想定する処理時間内に戻ってくるとは限りませんので、重要な仕事で使用時にはタイムアウト等考えておきましょう。

以上です。

itsysgroup: