【问题标题】:How to drop columns in a compressed table?如何删除压缩表中的列?
【发布时间】:2018-05-30 08:37:41
【问题描述】:

压缩表格后,无法再删除列:

CREATE TABLE foo (p NUMBER, i NUMBER, j NUMBER) COMPRESS BASIC;

ALTER TABLE foo DROP COLUMN j;
ORA-39726: unsupported add/drop column operation on compressed tables

如果使用高级压缩是可能的:

CREATE TABLE foo (p NUMBER, i NUMBER, j NUMBER) COMPRESS FOR OLTP;

ALTER TABLE foo DROP COLUMN j;
Table FOO altered.

但是,该列并没有真正删除,只是隐藏了:

SELECT column_name, data_type, hidden_column 
  FROM user_tab_cols WHERE table_name = 'FOO';

COLUMN_NAME                 DATA_TYPE  HIDDEN_COLUMN
P                           NUMBER     NO
I                           NUMBER     NO
SYS_C00002_18030204:09:26$  NUMBER     YES

这会在交换分区时导致错误:

CREATE TABLE par (p NUMBER, i NUMBER) 
 PARTITION BY LIST(p)(
 PARTITION p1 VALUES(1), 
 PARTITION p2 VALUES(2)
);

ALTER TABLE par EXCHANGE PARTITION p1 WITH TABLE foo;
ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION

如何删除隐藏列?我试过了

ALTER TABLE foo DROP UNUSED COLUMNS;

但它没有帮助:

SELECT column_name, data_type, hidden_column 
  FROM user_tab_cols WHERE table_name = 'BAR';

COLUMN_NAME                 DATA_TYPE  HIDDEN_COLUMN
P                           NUMBER     NO
I                           NUMBER     NO
SYS_C00002_18030204:09:26$  NUMBER     YES

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    Oracle 支持文档 1987500.1 “How to Drop Columns in Compressed Tables” 有解决方案:需要先解压缩表,删除列,然后才能再次压缩:

    ALTER TABLE foo MOVE NOCOMPRESS;
    ALTER TABLE foo DROP UNUSED COLUMNS;
    ALTER TABLE foo MOVE COMPRESS FOR OLTP;
    
    SELECT column_name, data_type, hidden_column 
      FROM user_tab_cols WHERE table_name = 'FOO';
    
    COLUMN_NAME                 DATA_TYPE  HIDDEN_COLUMN
    P                           NUMBER     NO
    I                           NUMBER     NO
    
    ALTER TABLE par EXCHANGE PARTITION p1 WITH TABLE foo;
    Table PAR altered.
    

    注意如果表为空,则压缩/重新压缩很快。

    【讨论】:

      【解决方案2】:
      update foo set j = null;
      commit;
      alter table foo set unused column j;
      

      Read more

      【讨论】:

        【解决方案3】:

        我在压缩表格时遇到了类似的问题。后来当试图删除该压缩表中的一列时,它给了我错误 ORA-39726: unsupported add/drop column operation on compressed tables。

        对我有用的解决方案是 - 我在表上运行了 COMPRESS FOR ALL OPERATIONS 命令,然后运行了 drop column 命令,它对我有用。

        例如:ALTER TABLE 压缩所有操作;

        ALTER TABLE 删除列 ;

        【讨论】:

          猜你喜欢
          • 2011-05-20
          • 2011-05-05
          • 2011-02-17
          • 1970-01-01
          • 2020-09-30
          • 1970-01-01
          • 1970-01-01
          • 2023-02-23
          • 2015-03-25
          相关资源
          最近更新 更多