0

現在、ファイルからテーブルにデータを挿入しています。テーブルに挿入する前にデータをフォーマットします(タブを削除する/キャリッジリターン/特定のテキストの文字コードを取得するなど)。まず、レコードが存在するかどうかを確認し、存在する場合は更新する必要があります。そうでない場合は、そのレコードをテーブルに挿入する必要があります。

私が抱えている問題は、非常に長い時間がかかることです。私は 2 つのファイルを持っています。1 つは 500k レコード未満で、もう 1 つは 4mil を超えています。一括収集を実行して両方を実行できる場合は?

例えば

open c_cur;
loop
  fetch c_cur bulk collect into examp limit 50000;
  exit when limit.count = 0
  forall x in 1..limit.count
    update table1
    set...
    where...

    if sql%notfound then
      insert into table1
      values (...)
    end if;
  commit;
end loop;
close c_cur;

これは可能ですか?

また、ステージング テーブルをセットアップしてそこにファイルをダンプし、そこから作業するという話も聞きました。それはより良い選択肢ですか?これにより、パフォーマンスがどの程度向上しますか?

また、ファイルからのテーブルでマージを実行しないことをお勧めします。

ありがとう。

4

2 に答える 2

0

sql%bulk_rowcount を使用できます

--after forall update:
for i in 1..examp.count loop
  if sql%bulk_rowcount(i) > 0 then
    examp.delete(i); -- record already updated - remove it from array
  end if;
end if;

-- loop only non-deleted elements here
forall i in indicies of examp
  insert into ....
于 2015-01-26T15:11:23.290 に答える