日期:2014-05-16  浏览次数:20460 次

OracleDBA之路Manager Table(一)

renaming a column
alter table table_name rename column old_column_name to new new_column_name;


Truncate table
TRUNCATE TABLE [schema.] table [{DROP | REUSE} STORAGE]
使用此命令的效果如下:
? 表中的所有行都被删除。
? 不会生成任何还原数据,且命令会隐式提交,因为 TRUNCATE TABLE是一个DDL 命令。
? 对应的索引也将截断。
? 不能截断某个外键正在引用的表。
? 使用此命令时不会触发删除触发器。

Drop Table
DROP TABLE [schema.] table[CASCADE CONSTRAINTS]
删除一个表后,该表所使用的区将得以释放。如果这些区是相邻的,则可以在以后某个时间自动或手动将它们合并。
如果该表是外键关系中的父表,就必须使用CASCADE CONSTRAINTS选项。


删除列
ALTER TABLE T_NAME DROP COLUMN comments CASCADE CONSTRAINTS CHECKPOINT 1000;
删除列可能需要很长时间,并且且需要大量的还原空间。从大型表中删除列时,可以指检查点来尽量减少还原空间的使用。在幻灯片上的示例中,每1,000 行出现一个检查点。在操作运行完成前,该表一直被标记为 INVALID。如果操作过程中例程失败,则该表在动后仍将处于 INVALID状态,因此该操作必须完成。
使用下面的语句可恢复中断的删除操作:
SQL> ALTER TABLE [schema.]table DROP COLUMNS CONTINUE;
如果表处于 VALID状态,则使用此语句将生成错误。


UNUSED
? 将列标记为未使用:
ALTER TABLE [schema.]table SET UNUSED COLUMN comments CASCADE CONSTRAINTS;
? 删除未使用的列:
ALTER TABLE [schema.]table DROP UNUSED COLUMNS CHECKPOINT 1000;
? 继续执行删除列操作:
ALTER TABLE [schema.]table DROP COLUMNS CONTINUE CHECKPOINT 1000;

除将列从表中删除以外,还可以先将列标记为“未使用”,以后再删除。因为没有删除数据,所以此操作不回收磁盘空间,因而具有速度比较快的优点。被标为 “未使用” 的列可在以后系统活动较少时从表中删除。
未使用的列就像不属于表一样。查询时看不到未使用列中的数据。此外,在执行DESCRIBE 命令时,也不会显示这些列的名称和数据类型。用户可以添加与未使用的列同名的新列。
如果想删除同一表中的两列,则可先将列设置为 “未使用” 然后再删除。在删除两列时,表中的所有行都会更新两次;但如果将这些列设置为“未使用” 然后再删除,则所有的行仅更新一次。


确定包含未使用列的表
要确定包含未使用列的表,可以查询视图DBA_UNUSED_COL_TABS。该查询可获取包含未使用列的表的名称及表中标记为未使用列的数目。下面的查询显示 HR 拥有的表EMPLOYEES含有一个未使用的列:
SQL > SELECT * FROM dba_unused_col_tabs;
OWNER TABLE_NAME COUNT
----- -------------- ------
HR EMPLOYEES 1
要确定已完成一部分 DROP COLUMN操作的表,可查询 DBA_PARTIAL_DROP_TABS视图。
SQL > SELECT * FROM dba_partial_drop_tabs;
OWNER TABLE_NAME COUNT
----- -------------- ------
no rows selected