0

ステージングテーブルから処理される別のテーブルに、多くの行、場合によっては数万から数十万の行をコピーする必要があるプロセスがあります。

通常、私はただ言うでしょう

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

私はこのプロセスをリファクタリングしていますが、これが最善の方法ではないと思います。宛先テーブルをロックせずにすべての行を一度にコピーするためのより良い(できればトランザクション的に安全な)方法はありますか?

4

1 に答える 1

0

テーブルパーティショニングを使用できますか?

  1. 宛先テーブルとステージング テーブルをいくつかの列 (日付や増分のバッチ ID など) で分割します。

  2. ステージングが完了したら、パーティションを処理テーブルに切り替えます。

  3. 処理が完了したら、処理されたパーティションを切り替えて切り捨てることができます

于 2013-01-07T03:33:37.313 に答える