トレース フラグ 1200 (これはグローバルだと思うので、開発マシン上) を使用して、自分でロックが解除されたことを確認できます
SET NOCOUNT ON;CREATE TABLE ##T(X INT)INSERT INTO ##T SELECT numberFROM master..spt_valuesCREATE TABLE #T(X INT)INSERT INTO #TSELECT *FROM ##T/*最初にトレース フラグをオフにしてコマンドを実行すると、lockinginfo が計画のコンパイルに関する無関係なものでいっぱいになることが少なくなります */GOPRINT '##T Read Committed'SELECT COUNT(*) FROM ##TPRINT '##T NOLOCK'SELECT COUNT(*) FROM ##T WITH (NOLOCK)PRINT '##T Finished'GOPRINT '#T Read Committed'SELECT COUNT(*) FROM #TPRINT '#T NOLOCK'SELECT COUNT(*) FROM #T WITH (NOLOCK)PRINT '#T Finished'GODBCC TRACEON(-1,3604)DBCC TRACEON(-1,1200)GOPRINT '##T Read Committed'SELECT COUNT(*) FROM ##TPRINT '##T NOLOCK'SELECT COUNT(*) FROM ##T WITH (NOLOCK)PRINT '##T Finished'GOPRINT '#T Read Committed'SELECT COUNT(*) FROM #TPRINT '#T NOLOCK'SELECT COUNT(*) FROM #T WITH (NOLOCK)PRINT '#T Finished'GODBCC TRACEOFF(-1,3604)DBCC TRACEOFF(-1,1200)DROP TABLE ##TDROP TABLE #T
プレ>グローバル一時テーブルの場合、当然のことながら、より多くの違いが生じます。
ローカルの
#temp
のロックの種類にはまだ小さな違いがあります ただし、テーブル。以下の出力のその部分を再現します#T Read CommittedProcess 56 OBJECT の IS ロックを取得:2:301244128:0 (クラス bit0 ref1) 結果:OKProcess 56 OBJECT の S ロックを取得:2:301244128:0 (クラス bit0 ref1) 結果:OKProcess 56 OBJECT のロック解除:2:301244128:0 #T NOLOCKProcess 56 OBJECT の Sch-S ロックの取得:2:301244128:0 (クラス bit0 ref1) 結果:OKProcess 56 HOBT の S ロックの取得:2:9079256880114171904 [BULK_OPERATION] ( class bit0 ref1) 結果:OKProcess 56 OBJECT のロックを解除:2:301244128:0
プレ>編集: 上記の結果はヒープの場合です。クラスタ化されたインデックスを持つ一時テーブルの結果は以下のとおりです。
#T Read CommittedProcess 55 OBJECT の IS ロックを取得:2:1790629422:0 (クラス bit0 ref1) 結果:OKProcess 55 OBJECT の S ロックを取得:2:1790629422:0 (クラス bit0 ref1) 結果:OKProcess 55 オブジェクトのロックを解放します:2:1790629422:0 #T NOLOCKProcess 55 オブジェクトの Sch-S ロックを取得します:2:1790629422:0 (クラス bit0 ref1) 結果:OKProcess 55 オブジェクトのロックを解放します:2:1790629422:0 #T 終了しましたコード> プレ>
BULK_OPERATION
の理由 ヒープ バージョンのロックについては、こちらで説明しています .しかし、ロックのオーバーヘッドが非常に小さいことがわかります。