過去に使用したもう1つの方法は、移動してwhileループで使用する主キーを使用して一時テーブルを作成することです。このようにして、一種のブロック方式でそれを行うことができるので、キャンセルしてロールバックしなければならなかった場合の大きなトランザクションオーバーヘッドを回避できます。
基本的に、最終的に行うのは、テーブル名への挿入(...)select(...)from table name where primary key in(select top 10000 key from temptable)
セカンダリ結果セットに必要な上位10000は、一時テーブルから削除して、再度処理されないようにすることができます。
さらに別の方法は、カーソルを使用して、一度に処理するレコードの数を減らすことです。
もう1つのループ方法は、whileループでこのようなことを行うことです。
@stopをintとして宣言しますset@stop=(select count(primaryKey)from tableName where primaryKey not in destinstiontable)
while(@stop> 0)トランザクションを開始します
destinationTableに挿入(...)select(...)from sourcetable where primaryKey not in(select primarykey from destinationtable)
専念
set @stop =(select count(primaryKey)from tableName where primaryKey not in destinstiontable)end
最も効率的ではありませんが、機能し、トランザクションログを記録し続けることができるはずです。必要な場合を除いて、no lockキーワードを使用して、この大規模な移動を行うときに他のトランザクションをブロックしないようにしてください(BCPまたはDTSを使用すると、はるかに高速になります)。
言われていることのいくつかはおそらくあなたの最善の策です。BCP、DTS、またはその他のバルクツールを使用します。インデックスを削除できれば、処理が大幅に高速化されます。