我有一个过程需要将许多行(可能是数万或数十万行)从临时表复制到另一个将被处理的表。
通常,我只想说
insert into production_table select * from staging_table
但是这个语句可能需要一个小时才能运行,所以为了不锁定处理表,我们使用客户端应用程序中的以下逻辑来移动接下来的 1,000 行,以便最终所有行都进入生产表:
do
{
max_id = select max(id) from production_table where jobid = YYY
insert into production_table (jobid, ...)
select top 1000 jobid, ... from staging_table
where id > @max_id
order by id asc
} while @row_count = 1000
我正在重构这个过程,我认为这不是最好的方法。有没有更好的(最好是事务安全的)方法来一次性复制所有行而不锁定目标表?