Sql server 为什么在SQLServer2008R2中使用merge命令删除行比delete语句花费更多的时间
这是我的场景:我有一个表Sql server 为什么在SQLServer2008R2中使用merge命令删除行比delete语句花费更多的时间,sql-server,Sql Server,这是我的场景:我有一个表TableA,我必须从中将数据归档到TableB。也就是说,对于给定的修改日期(例如,2015-01-01),我必须从TableA中删除行,并将删除的行插入TableB) 现在,由于要删除的数据行数为200万,因此我必须分块删除这些行,以尽量减少锁定 在这两种方法中,我观察到simpledelete语句远远优于merge语句删除语句从表A中删除并将删除的记录插入表B需要15秒。但是,使用merge语句完成相同的任务需要7分钟。有人能告诉我为什么吗 请参阅以下我的代码以供参
TableA
,我必须从中将数据归档到TableB
。也就是说,对于给定的修改日期(例如,2015-01-01
),我必须从TableA
中删除行,并将删除的行插入TableB
)
现在,由于要删除的数据行数为200万,因此我必须分块删除这些行,以尽量减少锁定
在这两种方法中,我观察到simpledelete
语句远远优于merge
语句<代码>删除语句从表A
中删除并将删除的记录插入表B
需要15秒。但是,使用merge
语句完成相同的任务需要7分钟。有人能告诉我为什么吗
请参阅以下我的代码以供参考:-
-----------Merge statement--------------
declare @i int = 1
while @i > 0
begin
begin try
begin transaction
merge top (1000) tableA as a
using tableB as b on a.id = b.id
when not matched by source and a.modifieddate = '2015-01-01'
then
delete
output deleted.id, deleted.column1, deleted.column2 into TableB(id, column1, column2);
set @i = @@rowcount
if @@trancount > 0
commit transaction
end try
begin catch
if @@trancount > 0
rollback transaction
end catch
end
现在是delete语句:
----------------Delete statement--------
declare @i int = 1
while @i > 0
begin
begin transaction
delete top (1000) a
output deleted.id, deleted.column1, deleted.column2 into TableB(id, column1, column2)
from tableA as a
where a.modifieddate = '2015-01-01'
set @i = @@rowcount
if @@trancount > 0
commit transaction
end
我在列上有适当的索引columndid
具有聚集索引,而column1、column2具有TableA
和TableB
的非聚集索引
有人能告诉我我的Merge
语句出了什么问题,为什么要花这么多时间
提前感谢不容易理解。。。最佳选择取决于许多因素-表大小、索引复杂度、出现频率等。。。从另一个角度看,您还可以创建一个ON DELETE触发器,将数据插入到新位置,作为对您执行的DELETE命令的反应。如果您可以使用一个简单的
删除,来实现您的要求,为什么你要尝试使用合并
来让你的生活复杂化呢?你需要看看你的查询计划。第一个查询正在执行某种查找或表扫描,这将比第二个查询(仅删除行)慢。为什么不粘贴到查询计划中,然后有人可以解释。检查两个变量的实际执行计划,以了解发生了什么。一件显而易见的事情:MERGE
连接两个表,DELETE
没有。DELETE语句没有使用tableB。在这种情况下,这些查询是不可比较的。两个版本的性能应该几乎相同。您在合并版本中加入tableB的原因是什么?我不明白那应该做什么。不容易理解。。。最佳选择取决于许多因素-表大小、索引复杂度、出现频率等。。。从另一个角度看,您还可以创建一个ON DELETE触发器,将数据插入到新位置,作为对您执行的DELETE命令的反应。如果您可以使用一个简单的删除,来实现您的要求,为什么你要尝试使用合并
来让你的生活复杂化呢?你需要看看你的查询计划。第一个查询正在执行某种查找或表扫描,这将比第二个查询(仅删除行)慢。为什么不粘贴到查询计划中,然后有人可以解释。检查两个变量的实际执行计划,以了解发生了什么。一件显而易见的事情:MERGE
连接两个表,DELETE
没有。DELETE语句没有使用tableB。在这种情况下,这些查询是不可比较的。两个版本的性能应该几乎相同。您在合并版本中加入tableB的原因是什么?我不明白那该怎么办。