2012-05-12 6 views
8

既存のテーブルに2つのDATE列を追加する必要があります。しかし、それは非常に時間がかかり、私はプロセスを終了しなければならない。奇妙なのは、それらの列を同じデータベースの他のテーブルに一時的に追加することができたことです。これらのテーブルの大半は、データとカラム数の両方で問題が発生しているテーブルよりも大きいものです。これらの新しい列を追加するには、どうすればよいですか?Oracle - テーブルに列を追加するのにはいつもかかります

+2

Oracleのバージョンは?デフォルト値を追加していますか、単に列を追加していますか?テーブルはどれくらい大きいですか? 「非常に長い」とは何ですか?時間?日々? –

+0

Oracle 10gです。はい私はこれらの列の1つにデフォルトとしてSYSDATEを追加しています。テーブルには11列の3.923.327レコードがあります。それは6分以上かかり、私はそのプロセスを中断しました。 –

+0

そのテーブルには何行ありますか? –

答えて

8

ここで私はこの問題を解決しました。以前は、列の追加時に列のデフォルト値を指定していました。しかし、最初にデフォルト値を持たない列を追加しました。列が追加された後、私はデフォルト値を指定し、待機することなく直ちに実行しました。デフォルト値についてのヒントについては、@ Justin Caveに感謝します。それが重要なポイントでした。

私は、列を追加するときにデフォルト値を指定すると、以前に挿入されたすべてのレコードにデフォルト値が書き込まれるという事実に関連していることは間違いありません。テーブルに500万のレコードがある場合、すべての行について新しく追加された列のデフォルト値を設定するように更新されます。 5百万のレコードを更新するのは、想像するほど高価です。しかし、カラムを追加した後にデフォルト値が設定された場合、先に挿入されたローの新しいカラムの値はNULLになるため、更新は行われません。

+0

あとでデフォルト値を追加するほうがはるかに高速でした... –

+2

@Jens - 後でデフォルト値を追加しても既存の行には影響しませんが、新しい列を追加するときはデフォルト値をそれぞれに設定する必要がありますrow - デフォルトがNULLでない場合は、Oracleは既存の行を参照する必要はありません。 –

+4

Oracle 11gでは、デフォルト値の列を追加することでこの問題が発生しなくなりました(Oracleは既存の行をすべて更新せず、メタデータを更新するだけです)。 –

2

また、varchar2(4000)列を追加するときに、この問題が発生しました。デフォルト値はであり、Oracle 11gでは61Kのローテーブルです。 30分後、カラムはまだ添加されなかった。

私は操作を中断しようとしましたが、再試行しましたが、まだ完了しませんでした。

効果:
代わりに番号の列を追加しようとしましたが、これは分割された秒です。落とした。
次に、分割されたvarchar2(1)列を追加しようとしました。落とした。
次に、varchar2(4000)列をもう一度追加しようとしましたが、分割された秒数しかかかりませんでした。

愚かな "回避策"ですが、これは他の誰でもこの問題に直面する可能性があります。

+0

これをアップしている人は、この作品でしたか?知っているのは面白いだろう... – Wouter

関連する問題