drop column und ORA-39726 bei komprimierten Tabellen
Problem:
DROP COLUMN scheitert mit ORA-39726
"Nicht unterstützter Vorgang ... bei komprimierten Tabellen"
-> Blöd, wer hat eigentlich die Komprimierung eingeschaltet? Und warum?
Lösung:
Wenn die Tabelle nicht per DROP und CREATE komplett neu erstellt werden kann (oder soll) wirds etwas aufwändiger:1) Spalte auf unused setzen:
alter table D_TBL set unused column X_FLAG ;
select * from all_unused_col_tabs;
-> hier sollten nun je Tabelle die Anzahl der nicht benutzten Spalten stehen.
2) Unbenutzte Spalten löschen:
alter table D_TBL drop unused columns;
Falls das nicht hilft (wg. Partitionierung???):
1) Kompression ausschalten (mit MOVE und ggfs parallel X!):
alter table D_TBL move nocompress;
bzw.
alter table D_TBL move partition P_XYZ nocompress;
2) dann unbenutzte Spalten löschen:
alter table D_TBL drop unused columns;
3) Kompression wieder einschalten (mit MOVE und ggfs parallel X!):
alter table D_TBL move compress;
bzw.
alter table D_TBL move partition P_XYZ compress;
Falls das eleganter geht, bin ich für Hinweise dankbar!
Zum (De-)Komprimieren aller Partitionen einer Tabelle z.B.
SELECT 'ALTER TABLE MY_TBL MOVE PARTITION '
|| PARTITION_NAME
|| ' (NO)COMPRESS;' SQL_TXT
FROM USER_TAB_PARTITIONS
WHERE table_name = 'MY_TBL'
ORDER BY PARTITION_POSITION;
...und Index-Rebuild nicht vergessen:
select 'ALTER INDEX '|| ip.index_name ||' REBUILD PARTITION '|| partition_name ||'; ' SQL_TXT
from all_indexes ai, all_ind_partitions ip
where ai.table_owner = 'MY_SCHEMA' and ai.table_name = 'MY_TBL'
and ai.partitioned = 'YES' and ai.index_name = ip.index_name
and ip.status = 'UNUSABLE';
Zum (De-)Komprimieren aller Partitionen einer Tabelle z.B.
SELECT 'ALTER TABLE MY_TBL MOVE PARTITION '
|| PARTITION_NAME
|| ' (NO)COMPRESS;' SQL_TXT
FROM USER_TAB_PARTITIONS
WHERE table_name = 'MY_TBL'
ORDER BY PARTITION_POSITION;
...und Index-Rebuild nicht vergessen:
select 'ALTER INDEX '|| ip.index_name ||' REBUILD PARTITION '|| partition_name ||'; ' SQL_TXT
from all_indexes ai, all_ind_partitions ip
where ai.table_owner = 'MY_SCHEMA' and ai.table_name = 'MY_TBL'
and ai.partitioned = 'YES' and ai.index_name = ip.index_name
and ip.status = 'UNUSABLE';
Kommentare
Kommentar veröffentlichen