2012-05-12 29 views
8

我需要將兩個DATE列添加到已存在的表中。但這需要很長時間,我必須殺死這個過程。奇怪的是,我能夠將這些列暫時添加到同一數據庫中的其他表中。這些表中的大部分都比我在數據和列計數方面遇到的問題要大。我需要做些什麼才能添加這些新列?Oracle - 向列添加列需要永久

+2

什麼版本的Oracle?你添加了一個默認值還是隻是添加列?桌子有多大?什麼是「很長」?小時?天? –

+0

它是Oracle 10g。是的,我將SYSDATE作爲默認添加到其中一列。該表有11欄,共有3.923.327條記錄。花了6分鐘以上,我只是打斷了這個過程。 –

+0

該表中有多少行? –

回答

8

這是我如何解決問題。之前,我在添加它們時爲列指定了默認值。但是,我首先添加了沒有默認值的列。列添加後,我指定了默認值,並立即執行,不再等待。非常感謝@Justin Cave提供有關默認值的提示。這是關鍵。

我毫不懷疑它與在添加列時指定默認值時將默認值寫入先前插入的所有記錄的事實有關。因此,如果表中有500萬條記錄,則該表將被更新爲爲所有行的新添加的列設置默認值。正如人們猜測的那樣,更新500萬條記錄的代價很高但是,如果在添加列後設置了默認值,那麼先前插入的行中新列的值將爲NULL,因此不會進行更新。

+0

有趣的是,稍後添加默認值的速度非常快...... –

+2

@Jens - 這是因爲稍後添加默認值不會影響現有行,而添加新列時,必須在每個列上設置默認值行 - 除非默認值爲NULL,在這種情況下,Oracle不必訪問現有行。 –

+4

應該注意的是,在Oracle 11g中,添加一個具有默認值的列不再存在這個問題(Oracle不會更新所有現有行,而只是更新元數據)。 –

2

在Oracle 11g中添加varchar2(4000)列而沒有默認值一個61K的行表時,我也遇到了這個問題。 30分鐘後,柱子仍未加入。

我試圖放棄操作,並重試它,但它仍然沒有完成。

什麼工作:
我試着添加一個數字列,而不是一秒鐘。丟棄它。
然後我試着添加一個varchar2(1)列,這花了一秒鐘。丟棄它。
然後我試着再次添加一個varchar2(4000)列,並且它只用了一秒鐘。

愚蠢的「解決方法」,但也許這也適用於任何其他人面臨這個問題。

+0

有人贊成這個,做了這項工作?知道...會很有趣... – Wouter