ステージングテーブルから処理される別のテーブルに、多くの行、場合によっては数万から数十万の行をコピーする必要があるプロセスがあります。
通常、私はただ言うでしょう
insert into production_table select * from staging_table
ただし、このステートメントの実行には1時間かかる可能性があるため、処理テーブルをロックしないために、クライアントアプリから次のロジックを使用して、次の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
私はこのプロセスをリファクタリングしていますが、これが最善の方法ではないと思います。宛先テーブルをロックせずにすべての行を一度にコピーするためのより良い(できればトランザクション的に安全な)方法はありますか?