SQL Server のクエリヒントによるロックへの影響(SELECT)

SQL Serverで、クエリヒントを使用するとロックにどのような影響が出るのかを調べてみました。

結論

image

標準クエリの場合、ISを取得するので、DDL文とXロック(SELECTだと、XLOCKクエリヒントを使ったクエリ)と競合する。UPDLOCKとは競合しない。

UPDLOCKは、キーにUを取得するので、DDL文と同一キーへのUとXと競合する。ページにIUを取得するので、ページへのUとXと競合する。キーへのUはトランザクション終了時まで保持される。

 

詳細は、ロックの互換性参照

調査方法

今回は単純なテーブルとクエリでの調査です。
4列あるテーブルで、100000行のデータを格納して、Where無しのクエリで処理をしています。

テーブル例

image

クエリ例

SELECT   [Uid]
      ,[AddTime]
      ,[EnemyId]
      ,[StrongType]
FROM [dev_next_dev].[dbo].[AAA]

クエリヒント無し

データベースにSロックを取得・
テーブルにISロックを取得。
PageにISロックを取得しますね。(検証中、まれにSの時もあり)

image

UPDLOCK

データベースにSロック
テーブルにIXロック
PAGEにIUロック
KEYにUロックを取得します。Keyは全レコード(Top1000なので1000行)のロックを保持します。

image

image

これは、トランザクションが終了するまで保持されていて、トランザクションが終了すると、KEYのUロックとPAGEのIUロック、テーブルのIXロックが解除されます。

image

NOLOCK

データベースにSロックを取得します。
テーブルにSCH-Sロックを取得します。

image

SCH-Cロックは、DDL文発行時に取得されるSCH-Mロックとのみ競合します。

TABLOCK

データベースにSロック
テーブルに大量のSロック

image

XLOCK

データベースにSロック
テーブルにISロック
テーブルにIXロック
ページにIXロック
キーごとにXロック

image

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください