SQL Serverは、2つのステートメントを折りたたむことはできず、ロックを1回だけ実行します。しかし、いずれにせよ、それを証明するのは簡単です。AdventureWorksテーブルのコピーを作成し、2種類の操作を実行して、取得したロックを比較してみましょう。最初にチェックするアプローチでは、約2倍のロックが実行されることがわかります。これは、出力の2つの部分を別々のファイルに分割し、それらに対して任意の種類の差分を実行することで確認できます(または、私の場合はサイズを比較するだけです)。 1.7MB対788KB)。
SELECT * INTO dbo.kablatz
FROM AdventureWorks2012.Sales.SalesOrderHeader;
SET NOCOUNT ON;
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
PRINT '---------------- Check first';
DBCC TRACEON(1200,3604,-1) WITH NO_INFOMSGS;
IF EXISTS (SELECT 1 FROM dbo.kablatz WHERE OrderDate < '20100101')
DELETE dbo.kablatz WHERE OrderDate < '20100101';
DBCC TRACEOFF(1200,3604,-1) WITH NO_INFOMSGS;
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
PRINT '---------------- Don''t check first';
DBCC TRACEON(1200,3604,-1) WITH NO_INFOMSGS;
DELETE dbo.kablatz WHERE OrderDate < '20100101';
DBCC TRACEOFF(1200,3604,-1) WITH NO_INFOMSGS;
GO
DROP TABLE dbo.kablatz;
ロジックは、削除する行のチェックが削除操作ですでに行われていることを示します。なぜそれを繰り返すのですか?