首页 > 解决方案 > SQL Server:合并迭代

问题描述

我必须将数百万行合并到一个表中。目标表有一个 AFTER UPDATE 触发器。整个过程消耗的内存比我想分配的要多得多,并且 tempdb 正在占用磁盘空间。

我想让 MERGE 命令一次分批运行 100,000 条记录。随着 SET ROWCOUNT 被弃用并且游标效率低下,我不确定最好的方法是什么。

标签: sqlsql-servermergesql-server-2017

解决方案


面向集合的方法将是有效运行查询的最佳方式。所以你所做的对我来说似乎很好。如果它消耗临时数据库等,则需要知道您是否正在执行任何正在减慢的逐行操作。通常,MERGE 是单个语句,因此是有效的。

要考虑的另一件事是,如果您在目标表上有索引,那么您可以删除这些索引,然后运行 ​​MERGE,然后重新创建索引。

谈到您的问题,您可以通过使用 mod 运算符并在循环中运行 MERGE 来拆分成批次

例如:

declare @i int
select @i=count(*)/10 from source


while @i>0
begin
   merge
    into dest d
   using (select *
            from source
           where id%10000=i --here id is the primary key of the source table
          ) s
      on d.id=s.id
    when matched
     set ...
    when not matched
     insert...
    ...rest of the insert/update logic here    

    set @i=@i-1
end

推荐阅读