0

我有一个过程需要将许多行(可能是数万或数十万行)从临时表复制到另一个将被处理的表。

通常,我只想说

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

我正在重构这个过程,我认为这不是最好的方法。有没有更好的(最好是事务安全的)方法来一次性复制所有行而不锁定目标表?

4

1 回答 1

0

可以使用表分区吗?

  1. 将目标表和临时表分区到某个列(如日期或增量 batchID)。

  2. 完成登台后,将分区切换到处理表。

  3. 处理完成后,您可以将已处理的分区切出并截断

于 2013-01-07T03:33:37.313 回答