2012-05-12 56 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