0

SqlServer2012を使用して、呼び出すことに利点はありますか

if exists (select * from tablename where condition) begin
   delete tablename where condition
end

電話するだけで

   delete tablename where condition

条件に一致する行がないことが多いのはいつですか?

特に、保持されるロックの数が少なくなる(または制限が少なくなる)のでしょうか。

私は適切な取引をしているので、競合状態を避けます。

4

1 に答える 1

1

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;

ロジックは、削除する行のチェックが削除操作ですでに行われていることを示します。なぜそれを繰り返すのですか?

于 2013-01-29T19:38:16.353 に答える