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万,因此我必须分块删除这些行,以尽量减少锁定

在这两种方法中,我观察到simple
delete
语句远远优于
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的原因是什么?我不明白那该怎么办。