我正在将数据从一个模式转换为另一个模式。源架构中的每个表都有一个“status”列(默认为NULL)。转换记录后,我将状态列更新为1.之后,我可以报告(未)转换的记录数。
虽然转换例程仍处于开发阶段,但我希望能够将状态的所有值快速重置为NULL。
表上的UPDATE语句太慢(记录太多)。有没有人知道一种快速的替代方法来实现这一目标?
答案 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,希望列很少。