0

mytable(**id**,colA,colB)500 万レコードのテーブルがあります。colA、colB には他の制約はありません。colB の値を colA にコピーし、colB を null にする必要があります。これが私が作成した手順です。5 分で実行される場合もあれば、45 分かかる場合もあります。このスクリプトの何が問題になっていますか? この間、他のプロセスがこのテーブルにアクセスしていないと確信しています。これを最適化するにはどうすればよいですか?(DBエンジン自体が遅いなど、この速度に影響を与える他の多くの要因があることを知っています。その時点でマシンがフルキャパシティで実行されている可能性があります。私の手にあるもの、つまり私のスクリプトを探しています。 )

 DECLARE


      l_update_total pls_integer := 0;

      CURSOR cur IS SELECT id, colB FROM mytable where colA is null;
      TYPE t_recs IS TABLE OF cur%ROWTYPE;
      l_loop_count pls_integer := 0;
      l_recs t_recs;
      l_rec cur%ROWTYPE;


    BEGIN

       OPEN cur;
       LOOP

            FETCH cur BULK COLLECT INTO l_recs LIMIT 500;

            EXIT WHEN l_recs.COUNT = 0;

            FOR indx IN 1 .. l_recs.COUNT 
            LOOP

                l_rec := l_recs(indx);
                UPDATE mytable SET colB=null,colA = l_rec.colB WHERE id = l_rec.id;
                l_update_total := l_update_total + SQL%ROWCOUNT;


            END LOOP;

            COMMIT;

       END LOOP;

END;
/
4

3 に答える 3