У нас есть таблица, которая секционирована (и подразделяется), сжата, а также имеет огромный объем данных. При удалении одного столбца (E_POOL_ID
) из существующей многораздельной таблицы с включенным сжатием столбцы переходят в неиспользуемые столбцы в dba_unused_col_tabs с именем столбца, например SYS_C****
. Из-за этого неиспользуемые столбцы (не видимые в реальной таблице) наши задания раздела обмена не были выполнены.
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production 0
TNS for IBM/AIX RISC System/6000: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0
TMP_PART_TEST1------- Partitioned table with compression enabled
TMP_PART_TEST1_STG--- Normal table.This table always truncate and load on monthly basis.
DROP TABLE TMP_PART_TEST1;
CREATE TABLE TMP_PART_TEST1
( POOL_ID NUMBER(15) NOT NULL,
NAME VARCHAR2(25 BYTE),
E_POOL_ID NUMBER(15))
PARTITION BY RANGE (POOL_ID)
(
PARTITION POOL_ID_1 VALUES LESS THAN (2),
PARTITION POOL_ID_2 VALUES LESS THAN (3),
PARTITION POOL_ID_3 VALUES LESS THAN (6)
) ROW STORE COMPRESS ADVANCED;
SELECT * FROM TMP_PART_TEST1;
--No rows
DROP TABLE TMP_PART_TEST1_STG;
CREATE TABLE TMP_PART_TEST1_STG
( POOL_ID NUMBER(15) NOT NULL,
NAME VARCHAR2(25 BYTE)
E_POOL_ID NUMBER(15));
INSERT INTO TMP_PART_TEST1_STG VALUES(1,'TEST1',22);
INSERT INTO TMP_PART_TEST1_STG VALUES(2,'TEST2',23);
INSERT INTO TMP_PART_TEST1_STG VALUES(3,'TEST3',24);
INSERT INTO TMP_PART_TEST1_STG VALUES(4,'TEST4',25);
INSERT INTO TMP_PART_TEST1_STG VALUES(5,'TEST5',26);
COMMIT;
ALTER TABLE TMP_PART_TEST1 exchange partition POOL_ID_1 WITH TABLE TMP_PART_TEST1_STG WITHOUT VALIDATION;
--table altered
SELECT * FROM TMP_PART_TEST1;
--5 rows exchanged
Here I am dropping this column E_POOL_ID in both tables.
ALTER TABLE TMP_PART_TEST1 drop column E_POOL_ID;
--table altered
ALTER TABLE TMP_PART_TEST1_STG drop column E_POOL_ID;
--table altered
INSERT INTO TMP_PART_TEST1_STG VALUES(6,'TEST11');
INSERT INTO TMP_PART_TEST1_STG VALUES(7,'TEST12');
INSERT INTO TMP_PART_TEST1_STG VALUES(8,'TEST13');
COMMIT;
select * from TMP_PART_TEST1_STG;
--3 rows
ALTER TABLE TMP_PART_TEST1 exchange partition POOL_ID_3 WITH TABLE TMP_PART_TEST1_STG WITHOUT VALIDATION;
При отбрасывании столбцов столбец секционированных таблиц сжатия собирается в словарь данных dba_unused_col_tabs.
select * from dba_unused_col_tabs where table_name='TMP_PART_TEST1';
Я нашел решения, мы можем распаковать секционированную таблицу и удалите столбец и снова сожмите таблицы.
Но из-за недоступности места на сервере мы не можем распаковать таблицу в базе данных oracle, так как она содержит огромное количество данных. У нас больше В этой таблице доступны 50-летние записи истории.
Есть ли другой способ удалить столбец без таблицы сжатия в базе данных oracle?