drop column与set unused

摘要:
在8i之前,如果需要删除表中的列,则需要删除该表并重新创建它。如果您在系统繁忙时实际删除了一个大表,您甚至可能会收到ORA-01562未能扩展回滚段numberstring。这是因为在删除列的过程中,可能会消耗整个undo段。此时,我们可以使用逻辑删除列:ALTER TABLE_ nameSETUNUSED;ALTERTABLEtable_名称设置未使用;逻辑删除后,删除的列将不可见。然后可以使用以下命令物理删除:ALTER TABLE_ nameDROPUNUSEDCOLUMNS;对于大型表,为了减少撤消日志,我们可以在处理特定行后使用CHECKPOINT选项强制执行检查点操作。ALTERTABLEtable_名称DROPUNUSEDCOLUMNCHECKPOINT5000;我们可以UNUSED_COL_TABS查看每个表中设置为未使用的列数。

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

 


 

免责声明:文章转载自《drop column与set unused》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Red5源代码分析把大文件切割成小文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL SQL_ERROR 错误号 1032解决办法

1032错误码说明:                MySQL主从同步的1032错误,一般是指要更改的数据不存在,SQL_THREAD提取的日志无法应用故报错,造成同步失败         (Update、Delete、Insert一条已经delete的数据)。    1032的错误本身对数据一致性没什么影响,影响最大的是造成了同步失败、同步停止。   ...

数据库触发器inserted和deleted详解

create trigger updateDeleteTimeon userfor updateasbegin  update user set UpdateTime=(getdate()) from user inner join inserted on user.UID=Inserted.UIDend 上面的例子是在执行更新操作的时候同时更新,...

ApexSQL Log中的Redo Script跟原始SQL不一致问题

最近遇到一个误更新数据的问题,使用ApexSQL Log做挖掘事务日志的时候,发现ApexSQL Log生成的Redo Script跟原始SQL是有区别的。它们并不是完全一致的。只是逻辑上等价而已。如下所示,我们做一个测试,如下所示,创建一个表后,并模拟忘记添加条件,出现误删除数据的情况   SELECT * INTO KERRY_TEST FROM S...

[转] hive0.14-insert、update、delete操作测试

FROM : http://blog.csdn.net/hi_box/article/details/40820341 首先用最普通的建表语句建一个表: [java] view plaincopy  hive>create table test(id int,name string)row format delimited fields ter...

谈C/C++ 指针精髓 CHRIS

指针是C和C++语言编程中最重要的概念之一,也是最容易产生困惑并导致程序出错的问题之一。利用指针编程可以表示各种数据结构, 通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯;并能像汇编[url=javascript:;]语言[/url]一样处理内存[地址从而编出精练而高效的程序。指针极大地丰富了C和C++语言的功能。 ­ ­ 在...

id 自增------删除数据后恢复到删除前自增id

删除数据后,执行下面语句:      ALTER TBALE TableName AUTO_INCREMENT=1 mysql删除比较 一、DROP   drop  table tablename     绝招:删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表 二、TRUNCATE   truncate tabl...