gpt4 book ai didi

sql - 如何删除压缩表中的列?

转载 作者:行者123 更新时间:2023-12-01 00:18:31 24 4
gpt4 key购买 nike

压缩表后,不能再删除列:

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

最佳答案

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.

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

关于sql - 如何删除压缩表中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com