我正在尝试向一个包含超过900万条记录的表添加新列。
此问题是列需要默认值为' N'。更新表时,数据库遇到填充临时数据的问题。而且,这需要花费大量的时间。
我想知道是否有人知道这样做更快或更好的方法来避免临时数据填满的问题。
数据库是Oracle10g。
答案 0 :(得分:0)
如果您可以移动到11g且列为NOT NULL
,则Oracle会进行优化,其中默认值不需要存储在每一行中,因此您可以非常快速地添加列。不幸的是,听起来你已经陷入了一个不可用的Oracle版本。
最有可能的是,除了等待之外,你没有很多非常好的选择。假设您在停机期间执行此操作,使用新列创建新表,执行从旧表到新表的所有数据的直接路径插入,重命名,可能会更高效表,并重新指向新表的任何约束。这实际上是否比等待更新更有效取决于您的硬件和表格,但INSERT
可能比UPDATE
更有效。另一方面,对于不会创建大量迁移行的新单字符列,您可能最好等待UPDATE
而不是达到此级别努力 - 有很多事情可能会出错,你需要测试和验证(即确保你正确更新了所有约束)。