我需要将两个DATE列添加到已存在的表中。但这需要很长时间,我必须杀死这个过程。奇怪的是,我能够将这些列暂时添加到同一数据库中的其他表中。这些表中的大部分都比我在数据和列计数方面遇到的问题要大。我需要做些什么才能添加这些新列?Oracle - 向列添加列需要永久
回答
这是我如何解决问题。之前,我在添加它们时为列指定了默认值。但是,我首先添加了没有默认值的列。列添加后,我指定了默认值,并立即执行,不再等待。非常感谢@Justin Cave提供有关默认值的提示。这是关键。
我毫不怀疑它与在添加列时指定默认值时将默认值写入先前插入的所有记录的事实有关。因此,如果表中有500万条记录,则该表将被更新为为所有行的新添加的列设置默认值。正如人们猜测的那样,更新500万条记录的代价很高但是,如果在添加列后设置了默认值,那么先前插入的行中新列的值将为NULL,因此不会进行更新。
有趣的是,稍后添加默认值的速度非常快...... –
@Jens - 这是因为稍后添加默认值不会影响现有行,而添加新列时,必须在每个列上设置默认值行 - 除非默认值为NULL,在这种情况下,Oracle不必访问现有行。 –
应该注意的是,在Oracle 11g中,添加一个具有默认值的列不再存在这个问题(Oracle不会更新所有现有行,而只是更新元数据)。 –
在Oracle 11g中添加varchar2(4000)列而没有默认值一个61K的行表时,我也遇到了这个问题。 30分钟后,柱子仍未加入。
我试图放弃操作,并重试它,但它仍然没有完成。
什么工作:
我试着添加一个数字列,而不是一秒钟。丢弃它。
然后我试着添加一个varchar2(1)列,这花了一秒钟。丢弃它。
然后我试着再次添加一个varchar2(4000)列,并且它只用了一秒钟。
愚蠢的“解决方法”,但也许这也适用于任何其他人面临这个问题。
有人赞成这个,做了这项工作?知道...会很有趣... – Wouter
- 1. DLL需要永久加载在JNI类
- 2. AchartEngine从db加载值需要永久
- 3. ProgressBar for WebView需要永久加载吗?
- 4. 运行Gradlelw需要永久
- 5. Git推动需要永久
- 6. 运行hmset()需要永久
- 7. SORT转换需要永久
- 8. 刀ec2 bootstrap需要永久
- 9. 我需要添加-DCMAKE_EXPORT_COMPILE_COMMANDS = ON以永久保存
- 10. mysql更改列允许null需要永久
- 11. 更改空表上的列类型需要永久
- 12. datagridview /绑定列表/绑定源绑定需要永久
- 13. Oracle数据提供程序适配器填充需要永久
- 14. 永久添加库在Python
- 15. 添加永久的CLASSPATH
- 16. 永久添加SSH密钥
- 17. 的NetBeans:添加库永久
- 18. 以编程方式向Matlab路径永久添加路径列表
- 19. 永久变更列表lisp
- 20. mysql导入45MB sql需要永久
- 21. XCode文档搜索需要永久
- 22. For循环需要永久运行
- 23. Android JNI调试需要永久
- 24. MongoDB replSet需要永久启动
- 25. Eclipse的“打开项目”需要永久
- 26. 验证GWT组件需要永久
- 27. Nutch 2.1网址注入需要永久
- 28. NodeJS需要永久构建AWS EC2
- 29. PHP socket fread响应需要永久
- 30. Matlab dir()需要永久运行
什么版本的Oracle?你添加了一个默认值还是只是添加列?桌子有多大?什么是“很长”?小时?天? –
它是Oracle 10g。是的,我将SYSDATE作为默认添加到其中一列。该表有11栏,共有3.923.327条记录。花了6分钟以上,我只是打断了这个过程。 –
该表中有多少行? –