我有一个进程需要将许多行(可能是数十或数十万)从登台表复制到另一个表中,这些表将被处理。
通常,我只是说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
我正在重构这个过程,我不认为这是最好的方法。是否有更好的(最好是事务安全的)方法一次性复制所有行而不锁定目标表?
答案 0 :(得分:0)
您可以使用表格分区吗?
将目标表和登台表分区到某个列上(如日期或增量batchID)。
完成分段后,将分区切换到处理表。
处理完成后,您可以切换已处理的分区并截断它