使用SqlServer2012,调用有没有优势
if exists (select * from tablename where condition) begin
delete tablename where condition
end
刚刚打电话
delete tablename where condition
什么时候通常不会有任何行匹配条件?
特别是,它会导致持有更少(或更少限制)的锁吗?
我正在进行适当的交易,因此我避免了竞争条件。
使用SqlServer2012,调用有没有优势
if exists (select * from tablename where condition) begin
delete tablename where condition
end
刚刚打电话
delete tablename where condition
什么时候通常不会有任何行匹配条件?
特别是,它会导致持有更少(或更少限制)的锁吗?
我正在进行适当的交易,因此我避免了竞争条件。
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;
逻辑会告诉我们,删除行的检查已经发生在删除操作中。为什么要重复?