0

300,000 レコードを超えるテーブルがいくつかあり、あるテーブルから別のテーブルにレコードを転送/コピーするには数時間かかります。大量のデータを処理する場合、カーソルを使用して各レコードを 1 つのテーブルから別のテーブルに 1 つずつコピーするよりも効率的で効果的な方法はありますか?

コード:

open SOMETBL 
fetch SOMETBL into @key1,@key2,@key3,@key4
while(@@fetch_status = 0)
 begin

  SELECT @key1InMapping = count(*) FROM SOMEOTHERDB.dbo.tblSOMETBLping WHERE fldEServicesKey = @key1

  SELECT @eServiceTypeKey = fldAServiceTypeKey FROM SOMEOTHERDB.dbo.tblAServiceType WHERE fldAServiceTypeNumber = @key4

 if (@eServiceTypeKey=null or @eServiceTypeKey=0)
           set @eServiceTypeKey = 50

  if @key1InMapping>0
  begin
    update SOMEOTHERDB.dbo.tblSOMETBLping set fldAServiceTypeKey=@eServiceTypeKey where fldEServicesKey= @key1
   -- print 'post='+convert(varchar,@key2) + ' :key1='+convert(varchar,@key1)+ ' :serviceTypeKey='+convert(varchar,@eServiceTypeKey)+' : serviceTypeNum='+convert(varchar,@key4)
  end
  fetch SOMETBL into @key1,@key2,@key3,@key4 

end

close SOMETBL 
4

1 に答える 1

4

300,000 レコードは、データベース用語で言えば少量のデータです。しかし、実際には数百以上のレコードに使用すべきではないカーソルを使用するには大きすぎます。率直に言って、セットベースのコードを書くことを学ぶと、とにかくカーソルよりも短く、書くのに時間がかかりません。したがって、カーソルを最初の選択肢として使用することはありません。これは最後の手段です。カーソルで一度に 1 つのレコードを挿入/更新または削除することを考えるべきではありません。セットベースの操作を使用します。300,000 件のレコードがある場合は、一度に 1 つずつカーソルを使用するのではなく、レコードのグループ (たとえば 10,000 件) を一度に処理する、セットベースとカーソルの組み合わせを検討することをお勧めします。

カーソルをセットベースのコードに変更する方法の詳細については、以下を確認してください。 http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

于 2013-09-06T17:24:46.003 に答える