既存のテーブルに2つのDATE列を追加する必要があります。しかし、それは非常に時間がかかり、私はプロセスを殺さなければなりません。奇妙なことに、これらの列を同じデータベース内の他のテーブルに一時的に追加できました。これらのテーブルのほとんどは、データと列数の両方で問題が発生しているテーブルよりも大きくなっています。これらの新しい列を追加できるようにするには、何をする必要がありますか?
2 に答える
これが私が問題を解決した方法です。以前は、列を追加した瞬間にデフォルト値を指定していました。しかし、最初にデフォルト値のない列を追加しました。列が追加された後、デフォルト値を指定すると、待機することなくすぐに実行されました。デフォルト値についてのヒントをありがとう@JustinCave。それがポイントでした。
列を追加するときにデフォルト値を指定すると、そのデフォルト値が以前に挿入されたすべてのレコードに書き込まれるという事実に関連していることは間違いありません。したがって、テーブルに500万レコードがある場合、そのテーブルは次のように更新されます。すべての行に新しく追加された列のデフォルト値を設定します。ご想像のとおり、500万レコードの更新にはコストがかかります。ただし、列を追加した後にデフォルト値が設定されている場合、前に挿入された行の新しい列の値はNULLになるため、更新は行われません。
Oracle 11g の 61K 行テーブルにデフォルト値のないvarchar2(4000) 列を追加するときにも、この問題に直面していました。30 分後、カラムはまだ追加されていません。
操作を中止して再試行しましたが、それでも完了しませんでした。
何がうまくいったか:
代わりに数値列を追加しようとしましたが、それには数秒かかりました。落とした。
次に、varchar2(1) 列を追加しようとしましたが、1 秒かかりました。落とした。
次に、varchar2(4000) 列を再度追加しようとしましたが、ほんの一瞬しかかかりませんでした。
ばかげた「回避策」ですが、これはこの問題に直面している他の人にも役立つかもしれません。