1

テーブルには約 20,80,000 のレコードがあります。それに新しい列を追加する必要があり、それを追加しました。

この新しい列は主キーである必要があり、すべての行をシーケンスで更新したいので、クエリは次のとおりです

BEGIN
FOR loop_counter IN 1 .. 211 LOOP
update user_char set id = USER_CHAR__ID_SEQ.nextval where user_char.id is null and rownum<100000;
commit;
END LOOP;
end;

しかし、これでほぼ 1 日が完了しました。まだクエリは実行中です。注: 私は db 開発者/プログラマーではありません。

このクエリまたは同じジョブを実行するための他のクエリ ソリューション (クイック) に問題はありますか?

4

1 に答える 1

2

まず、ここで PL/SQL を使用する理由はないようです。単純に単一の SQL ステートメントを発行してすべての行を更新する方が効率的です。

UPDATE user_char
   SET id = USER_CHAR__ID_SEQ.nextval
 WHERE id IS NULL;

状況によっては、新しいテーブルを作成し、古いテーブルから新しいテーブルにデータを移動して、行の移行を回避する方が効率的な場合もあります。

ALTER TABLE user_char
  RENAME TO user_char_old;

CREATE TABLE user_char
AS
SELECT USER_CHAR__ID_SEQ.nextval, <<list of other columns>>
  FROM user_char;

<<Build indexes on user_char>>
<<Drop and recreate any foreign key constraints involving user_char>>

これが大きなテーブルである場合は、CREATE TABLEステートメントで並列処理を使用できます。小さな 200 万行のテーブルで並列処理から多くの利点が得られるかどうかは明らかではありませんが、操作が数秒短縮される可能性があります。

第 2 に、わずか 200 万行を更新するのに 1 日かかる場合は、何か他のことが起こっているに違いありません。最近では、200 万行のテーブルは非常に小さくなっています。ラップトップで 200 万行のテーブルにデータを入力して更新するには、数秒から数分かかります。このテーブルにトリガーはありますか? 外部キーはありますか? 行を更新している他のセッションはありますか? クエリは何を待っていますか?

于 2012-10-15T03:30:36.140 に答える