SELECT
NOLOCK
を使用したクエリ SCH-S
が必要です。 (スキーマの安定性) テーブルのロック (ヒープ hobt
も必要です ロック
)。
さらに SELECT
の前に SQL Server は、ステートメントの計画をコンパイルする必要があります。これには、SCH-S
を取ることも必要です。 テーブルにロックアウトしてください。
長時間実行されるトランザクションが SELECT ... INTO
を介してテーブルを作成すると、 互換性のない SCH-M
を保持しています ステートメントが完了するまでロックします。
sys.dm_os_waiting_tasks
を調べると、これを確認できます。 その間 その間 ブロッキング期間中。
1つの接続で次のことを試したとき
BEGIN TRAN SELECT * INTO NewT FROM master..spt_values /*Remember to rollback/commit this later*/
プレ>そして、実行します (または単に推定実行計画を表示しようとします)
SELECT * FROM NewT WITH (NOLOCK)
プレ>すぐに読み取りクエリがブロックされました。
SELECT wait_type, resource_description FROM sys.dm_os_waiting_tasks WHERE session_id = <spid_of_waiting_task>
プレ>待機タイプが確かに
SCH_S
であることを示します ブロッキング リソースSCH-M
wait_type resource_description ---------------- ------------------------------------------------------------------------------------------------------------------------------- LCK_M_SCH_S objectlock lockPartition=0 objid=461960722 subresource=FULL dbid=1 id=lock4a8a540 mode=Sch-M associatedObjectId=461960722
プレ>