从Range Partitioned和Compressed表中删除一列

时间:2013-12-19 12:22:29

标签: oracle oracle11g

我有一个包含数据的表,需要删除一个标记为未使用的列。但它会因压缩表而产生错误。

我使用了命令

ALTER TABLE <table name> MOVE NOCOMPRESS NOLOGGING PARALLEL 4;

但它给出了这个错误:

  

ORA-14511:无法对分区对象执行操作

如何禁用分区?如何删除未使用的列?

1 个答案:

答案 0 :(得分:2)

不,您不能move使用一个alter table语句对分区表进行分区,您需要通过分区将该表重定位到新的分区分区中:

创建测试表:

SQL>  create table t1(
  2      col1 number,
  3       col2 number
  4    )
  5    partition by range(col1) (
  6      partition p_1 values less than (10) compress,
  7      partition p_2 values less than (20) compress
  8    );

Table created.

使用一些示例数据填充测试表:

SQL> insert into t1(col1, col2)
  2      select level
  3           , level
  4        from dual
  5     connect by level <= 3;

3 rows created.

SQL> commit;

Commit complete.

SQL> select * from t1;

      COL1       COL2        
---------- ----------      
         1          1      
         2          2    
         3          3  

删除列语句失败:

SQL> alter table t1 drop column col2;
alter table t1 drop column col2
                           *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables 

表重定位失败:

SQL> alter table t1 move nocompress;
alter table t1 move nocompress
            *
ERROR at line 1:
ORA-14511: cannot perform operation on a partitioned object 

执行每个分区的重定位:

SQL> alter table t1 move partition p_1 nocompress;

Table altered.

SQL> alter table t1 move partition p_2 nocompress;

Table altered.

如果分区太多,您可以在查询alter table数据字典视图时轻松生成user_tab_partitions语句。例如:

SQL> column res format a50
SQL> select 'alter table '   || t.table_name ||
  2         ' move partition ' || t.partition_name ||
  3         ' nocompress;' as res
  4    from user_tab_partitions t
  5  where t.table_name = 'T1';

RES                                              
--------------------------------------------------  
alter table T1 move partition P_1 nocompress;   
alter table T1 move partition P_2 nocompress;  

使用nocompress选项移动所有分区后,您可以删除发布的列:

alter table t1 drop column col2

声明或

alter table t1 drop unused columns 

语句,如果您在重定位之前已将列标记为未使用。

删除未使用的列:

col2未使用

SQL> alter table t1 set unused(col2);

Table altered.

列出架构中未使用列的表

SQL> column table_name format a5
SQL> column table_name format a5
SQL> select *
  2    from user_unused_col_tabs;

TABLE      COUNT  
----- ----------        
T1             1    

重新定位分区

SQL> alter table T1 move partition P_1 nocompress;

Table altered.

SQL> alter table T1 move partition P_2 nocompress;

Table altered.

删除未使用的列:

SQL> alter table t1 drop unused columns;

Table altered.

确保我们放弃了我们想要删除的所有内容。 Col2消失了:

SQL> desc t1;

Name     Null?    Type
-------- -------- -----------
COL1              NUMBER

没有未使用列的表:

SQL> select *
  2    from user_unused_col_tabs;

no rows selected