Как установить начальный размер экстента партиции при преобразовании? ORA-02203: INITIAL storage options not allowed
Пытаюсь преобразовать обычную таблицу в партиционированную. Начиная с 12c, функция alter table modify partition ... доступна для такого преобразования таблиц.
Есть таблица, у которой размер initial_extent установлен на 544 МБ. Это слишком много. Фактический размер первого экстента составляет 8 МБ. Когда преобразовываю, в итоге получается 90 разделов с начальным размером 544 МБ. Это приводит к утроению размера таблицы. Многие партиции пусты на 90% и более.
Как установить начальный размер экстента партиции в разумное значение во время преобразования?
Пересоздание таблицы alter table move с новыми параметрами хранения не будет решением, поскольку размер некоторых из этих таблиц составляет более терабайта. Возможно, что-то упускаю, но я не могу найти способ изменить или указать начальный размер экстента.
ALTER TABLE mytable MODIFY Partition by range (mydatecol)
interval (NUMTOYMINTERVAL (1,'MONTH')) (
partition p1308 values less than (to_date('01-SEP-2013','dd-mon-yyyy'))
)
storage (initial 1m)
UPDATE INDEXES ONLINE;
Без клаузы storage работает, а с ней даёт ошибку:
ORA-02203: INITIAL storage options not allowed
Свободный перевод вопроса Initial extent size when converting to partitioned table от участника @jparker
Ответы (1 шт):
Надо указать клаузу storage для каждой партиции, а не для всей таблицы:
create table t (val int) storage (initial 10m)
/
insert into t
select level x from dual connect by level <= 5
/
alter table t modify
partition by range (val) interval (1) (
partition p1 values less than (2) storage (initial 8k),
partition p2 values less than (3) storage (initial 64k),
partition p3 values less than (4) storage (initial 128k));
select partition_name, initial_extent
from user_tab_partitions
where table_name='T';
PARTITION_NAME INITIAL_EXTENT
---------------- --------------
P1 16384
P2 65536
P3 131072
SYS_P10883 10485760
SYS_P10884 10485760
Обратите внимание, так как это нужно делать для всех партиций, то автоматически созданные партиции будут иметь тот же начальный размер, что и исходная таблица.
Изменить можно с помощью клаузы modify default attributes:
insert into t values (6);
alter table t modify default attributes storage (initial 16k);
insert into t values (7);
select partition_name, initial_extent
from user_tab_partitions
where table_name='T';
PARTITION_NAME INITIAL_EXTENT
---------------- --------------
P1 16384
P2 65536
P3 131072
SYS_P10883 10485760
SYS_P10884 10485760
SYS_P10885 10485760
SYS_P10886 16384
Свободный перевод ответа от участника @Chris Saxon