代码之家  ›  专栏  ›  技术社区  ›  Martin Schapendonk

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

  •  1
  • Martin Schapendonk  · 技术社区  · 14 年前

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

    虽然转换例程仍在开发中,但我希望能够将status的所有值快速重置为空。

    表上的更新语句太慢(记录太多)。有人知道一个快速的替代方法来完成这一点吗?

    6 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    8 年前

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

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

    就像在 Nivas' answer 列的实际顺序将被更改(reset列将是最后一列)。如果您的代码依赖于列的顺序(它不应该!)您可以创建一个视图,该视图将在 正确的 顺序(重命名表、创建与旧表同名的视图、从基表撤消授予、向视图添加授予)。

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

        2
  •  2
  •   Nivas    14 年前

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

        3
  •  1
  •   Graham    14 年前

    虽然转换例程仍在开发中,但我希望能够将status的所有值快速重置为空。

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

        4
  •  1
  •   erbsock    14 年前

    你试过用倒叙表吗?

    例如:

    select current_scn from v$database;
    -- 5607722 
    
    -- do a bunch of work
    
    flashback table TABLE_NAME to scn 5607722;
    

    这样做的目的是确保每次运行测试时处理的表都是相同的。当然,您需要确保有足够的撤消操作来保存更改。

        5
  •  0
  •   Randy    14 年前

    嗯。也许给状态栏加个索引。

    或者,添加一个新表,其中只包含主键。然后在转换记录时插入该表,并TRUNC该表以重置。。。

        6
  •  0
  •   orbfish    14 年前

    我喜欢其他一些答案,但我刚在一本调整书中读到,由于几个原因,重建表通常比在表上进行大量更新更快。在本例中,这似乎是理想的,因为您将把CREATE TABLE X编写为SELECT,希望只有很少的列。