zoukankan      html  css  js  c++  java
  • drop column与set unused

    8i以前,如果需要删除表中的列,需要删除表然后重新建。现在,但我们需要删除一个列时,可以有以下两种方法:

    • Logical Delete
    • Physical Delete

    Logical Delete(逻辑删除)

    我们需要删除表的一个列,通常采用物理删除(ALTER TABLE table_name DROP COLUMN column_name)。但如果是一个大表,这将是一个及其消耗时间和资源的操作。假若在系统繁忙时对大表做物理删除,甚至可能会收到 ORA-01562 - failed to extend rollback segment number string。这是因为在这个删除列的过程中,可能会消耗光整个undo segment.

    此时,我们可以采用逻辑删除列:

    ALTER TABLE table_name SET UNUSED (column_name);
    ALTER TABLE table_name SET UNUSED (column_name1, column_name2);

     

    逻辑删除后,被删除的列就不可见了。之后便可以用以下命令进行物理删除:

    ALTER TABLE table_name DROP UNUSED COLUMNS;

     

    对于大表,为了减少undo logs,我们可以使用CHECKPOINT选项在处理了特定行后来强制checkpoint操作。

    ALTER TABLE table_name DROP UNUSED COLUMNS CHECKPOINT 5000;

     

    我们可以在DBA_UNUSED_COL_TABS查看每个表中被设置为unused的列的数量。

     


    Physical Delete(物理删除)

    ALTER TABLE table_name DROP COLUMN column_name;
    ALTER TABLE table_name DROP (column_name1, column_name2);

     

    使用DROP COLUMN物理删除表中列的同时,也会物理删除表中unused的列。

     

    测试代码:

     

    SQL> create table test (t1 varchar2(10), t2 number, t3 number);

    Table created

    SQL> insert into test values ('Tough1',1,1);

    1 row inserted

    SQL> insert into test values ('Tough2',2,2);

    1 row inserted

    SQL> select * from test;

    T1                 T2         T3
    ---------- ---------- ----------
    Tough1              1          1
    Tough2              2          2

     

    --逻辑删除test表的t3列
    SQL> alter table test set unused (t3);

    Table altered

     

    --此时t3列已经不可见
    SQL> select * from test;

    T1                 T2
    ---------- ----------
    Tough1              1
    Tough2              2

     

    --我们可以在user_unused_col_tabs表中查看到test表中设置为unused列的数量
    SQL> select * from user_unused_col_tabs;

    TABLE_NAME                          COUNT
    ------------------------------ ----------
    T2                                      2
    TEST                                    1

     

    --物理删除test表的t2列
    SQL> alter table test drop column t2;

    Table altered

     

    --物理删除test表t2列时,把之前逻辑删除的t3列也物理删除了
    SQL> select * from user_unused_col_tabs;

    TABLE_NAME                          COUNT
    ------------------------------ ----------
    T2                                      2


    SQL> select * from test;

    T1
    ----------
    Tough1
    Tough2

     


     

  • 相关阅读:
    MYSQL 数据库管理
    maven初学总结
    解决问题的思路
    java泛型综述
    几种不常用的排序算法
    创新思维
    Django从入门到放弃
    KlayGE 4.0中Deferred Rendering的改进(二):拥挤的GBuffer
    用Android NDK r6编译boost 1.47
    glloader移植到了Android
  • 原文地址:https://www.cnblogs.com/toughhou/p/3778792.html
Copyright © 2011-2022 走看看