2

私はOracleデータベースを使用していますが、私がしていることは

  1. テーブル A の 1 つのレコードを取得します (テーブル A には列 P があり、その値は x、y、z であるとします)

  2. 値 x、y、z に従って、そのレコードをテーブル B または C または D に配置します ( P=x の場合はレコードをテーブル B に配置し、 P=y の場合はレコードをテーブル C に配置します ...)

  3. テーブル B または C または D に挿入した A のレコードを削除します。

注: A のサイズは 2 億のようで、B は 170 C は 20 D は 10 なので、A のサイズは減少しています。他は同じです (A レコードのパラメーターが負の場合、B、C、D には挿入されません)。これらのテーブルに存在するため、テーブルから削除しただけです)、B、C、D のサイズは変更されず、A のサイズが時間とともに減少します。

問題は、最初はすべてがうまく機能していることですが、時間が経つにつれて非常に遅くなります。およそ 1 秒で 40 回の挿入と削除を行っていますが、時間的には 3 秒で 1 回の挿入と削除を処理しています。

  • すべてのテーブルには、対応する列にインデックスがあります。

  • 並列実行は存在しますが、ロックはありません。

  • テーブルのサイズは約 6,000 万レコードです。

テーブルのロックまたはサイズの増加がない場合、他のどのような効果が間に合うのでしょうか??

注:異なるプロセスではありません。同じプロセスで「クエリの実行」をクリックすると、非常に高速に開始されますが、非常に遅くなります。

4

1 に答える 1

2

ステージング テーブルから 2 億件のレコードを挿入し、それらを 1 回のトランザクションで永続テーブルに挿入するのは野心的です。テーブル A のレコードを個別のチャンクで処理できるチャンクに分割するためのスキームがあれば便利です。

コードを見ないとわかりにくいですが、より効率的なセットベースのアプローチではなく、この RBAR を試みている疑いがあります。ここでの鍵は、挿入をテーブル A の消去から分離することだと思います。すべてのレコードを挿入し、暇なときに A をザップします。このようなもの

insert all
    when p = 'X' then into b
    when p = 'Y' then into c
    when p = 'Z' then into d
select * from a;

truncate table a;
于 2013-12-28T19:31:37.970 に答える