1

古いテーブルと新しいテーブルがあります。古いテーブルには、と のような値を持つというVARCHAR2列があります。また、いくつかのくだらないデータがありますが、null になることはありません。number11-38D40234211-38D402342/43

新しいテーブルには、 と の 2 つのVARCHAR2列がnumber_leftありnumber_rightます。これらの 2 つは、古いテーブルの数値列から入力されました。

number_left  = nvl(substr(number,1,instr(number,'/',1)-1),number)
number_right = substr(number,1,instr(rtrim(number,'/'),'/',1)-length(substr(number,instr(number,'/'))))||substr(number,decode(instr(number,'/'),0,null,instr(number,'/')+1))

他のいくつかの決定の後、必要な列は 1 つだけになりました。コピーされた数値が正しく設定されるようにするために、古いテーブルの数値と使用された変換を使用して、一致する行を特定することにしました。

アプリケーションによって number_left と number_right を新しい行にコピーでき、古い番号も取得する必要があるため、マッピングはありますが使用できません。そのため、多くの古いテーブルが新しいテーブルの複数の行にコピーされる可能性があります。

私はこのコードを使用してみました:

declare
    left_num varchar2(255 char) := '';
    right_num varchar2(255 char) := '';
    pos number := 0;
    CURSOR c_number is
        select number from old_table;
begin
    for cur in c_number loop
        left_num := nvl(substr(cur.number,1,instr(cur.number,'/',1)-1),cur.number);
        if instr(cur.number,'/') = 0 then
          pos := null;
        else
          pos := instr(cur.number,'/')+1;
        end if;
        right_num := substr(cur.number,1,instr(rtrim(cur.number,'/'),'/',1)-length(substr(cur.number,instr(cur.number,'/'))))||substr(cur.number, pos);

        update new_table n
            set n.number = cur.snummer
            where n.number_left = left_num
            and (
              n.number_right = right_num
              or (
                n.number_right is null
                and right_num is null
              )
            );
    end loop;
end;

古いテーブルには 170.000 行あり、新しいデータもいくつかあるため、新しいテーブルには 180.000 行あります。ピーナッツ。

しかし、ここで奇妙な部分が発生します。すべてが正常に動作しているように見えますが、最初の 14.000 行を過ぎると、非常に遅くなり、おそらく 1 秒間に 3 行になります。そして、それはますます遅くなると思います。

何か案が?

4

1 に答える 1

0

無作為な初心者に推測を求めるのではなく、データベース内の SQL のパフォーマンスをトレースする方法を学ぶ必要があります。ステートメントのパフォーマンスを把握する方法はいくつかありますが、ある程度の DBA タイプのアクセスが必要になります。

これは公式ドキュメントでカバーされている領域ですが、Tim Hall の優れた概要から始めることをお勧めします。 ここで見つけてください

于 2012-10-16T07:50:38.657 に答える