Oracle 12 c база данных :: Есть ли другой способ удалить столбец без таблицы несжатия в базе данных oracle? - PullRequest
1 голос
/ 13 марта 2020

У нас есть таблица, которая секционирована (и подразделяется), сжата, а также имеет огромный объем данных. При удалении одного столбца (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?

...