快速将所有列值重置为默认值

时间:2010-11-18 13:06:38

标签: sql oracle plsql

我正在将数据从一个模式转换为另一个模式。源架构中的每个表都有一个“status”列(默认为NULL)。转换记录后,我将状态列更新为1.之后,我可以报告(未)转换的记录数。

虽然转换例程仍处于开发阶段,但我希望能够将状态的所有值快速重置为NULL。

表上的UPDATE语句太慢(记录太多)。有没有人知道一种快速的替代方法来实现这一目标?

6 个答案:

答案 0 :(得分:3)

重置列的最快方法是SET UNUSED列,然后添加一个具有相同名称和数据类型的列。

这将是最快的方式,因为两个操作都不会触及实际的表(只有字典更新)。

Nivas' answer一样,列的实际排序将会更改(重置列将是最后一列)。如果您的代码依赖于列的排序(它不应该!),您可以创建一个视图,该列将具有 right 顺序的列(重命名表,创建与旧表同名的视图) ,从基表中撤销授权,添加授权查看)。

SET UNUSED方法不会回收列使用的空间(而删除列将释放每个块中的空间)。

答案 1 :(得分:2)

如果列可以为空(因为默认值为NULL,我认为是这种情况),请删除并再次添加该列?

答案 2 :(得分:1)

  

虽然转换例程仍处于开发阶段,但我希望能够将状态的所有值快速重置为NULL。

如果您正在开发中,为什么需要7000万条记录?为什么不针对数据的子集进行开发?

答案 3 :(得分:1)

您是否尝试过使用闪回表?

例如:

select current_scn from v$database;
-- 5607722 

-- do a bunch of work

flashback table TABLE_NAME to scn 5607722;

这样做可确保每次运行测试时您正在使用的表都是IDENTICAL。当然,您需要确保有足够的UNDO来保存您的更改。

答案 4 :(得分:0)

HM。也许可以在状态列中添加一个索引。

或者替代地,添加一个仅包含主键的新表。然后在转换记录时插入到该表,并TRUNC该表重置...

答案 5 :(得分:0)

我喜欢其他一些答案,但我只是在一本调整书中读到,由于多种原因,重新制作表格通常比在桌面上进行大量更新更快。在这种情况下,它似乎是理想的,因为你将编写CREATE TABLE X AS SELECT,希望列很少。