1

私は、完了するのに多くの時間とリソースを必要とする手順を作成しました。Oracleサーバーの速度が大幅に低下し、社内の他のすべてのユーザーが作業できなくなったため、DB管理者は手順を強制終了する必要がありました。

私の手順は次のようなものです:

procedure my_proc IS
  cursor c IS (SELECT id FROM very_larg_table);
  row_ c%rowtype;
begin
  open c;
    fetch c into row_;
    exit when c%notfound;

    run_a_task_that_takes_0.2_of_a_second_per_run(row_.id);
    commit;

  end loop;
  close c;
end;

very_large_table約25万行あります。これに 0.2 秒を掛けると、14 時間の実行時間が得られます。

このタスクは 1 回だけ実行します。多くの条件に基づいて追加のデータを構築する必要があります。実行後、このデータは許容時間内に新しいレコードごとにライブで構築され、それ以上履歴的に再構築されることはありません。

しかし、これは私たちのデータベースで実行する必要がある方法です。システム全体への影響を抑えながら、たとえば 24 時間実行できるように速度を落とすにはどうすればよいでしょうか。

4

2 に答える 2

0
  1. コレクションからデータを一括収集very_larg_tableし、カーソルを介さずにループします。250k の plsql/sql コンテキスト スイッチとフェッチのオーバーヘッドがなくなります。

  2. トランザクションの最後に一度だけコミットする

于 2013-10-15T10:24:37.323 に答える