锁定和删除当没有要删除的行时,在sqlserver中

时间:2013-01-29 18:28:31

标签: sql-server-2012 locks

使用SqlServer2012,调用

有什么好处
if exists (select * from tablename where condition) begin
   delete tablename where condition
end

只是打电话

   delete tablename where condition

什么时候经常没有符合条件的行?

特别是,它会导致持有更少(或更少限制)的锁吗?

我正在进行适当的交易,所以我避免竞争条件。

1 个答案:

答案 0 :(得分:1)

SQL Server无法折叠这两个语句,只能执行一次锁定。但无论如何,这很容易证明。让我们复制一个AdventureWorks表,执行两种类型的操作,并比较所采用的锁。您将看到您首先检查的方法执行大约两倍的锁定 - 您可以通过将输出的两个部分拆分为单独的文件并对它们执行任何类型的差异来检查这一点(或者只是比较大小 - 在我的情况下) 1.7 MB与788 KB)。

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;

逻辑将告诉我们在删除操作中已经检查了要删除的行。为什么重复一遍呢?