При партиционировании по интервалу ошибка: ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions

Есть приложение, в котором автоматизировано добавление партиций с партиционированием по интервалу, но столкнулись с проблемой.

Есть примерно такая партиционированная таблица:

create table t (x int)
    partition by range(x) interval(1) ( 
        partition p0 values less than (1));

Table created.

insert into t values (1048574);

1 row created.

insert into t values(1048575)
Error report -
ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions

Чтобы обойти ошибоку, изменили таблицу на партиционирование по диапозону, и теперь работает:

alter table t set interval()
/
Table T altered.

alter table t add partition p1
    values less than (1048600)
/
Table T altered.

insert into t values(1048575);

1 row inserted.

Почему эта ошибка возникает при партиционировании по интервалу, но не по диапозону?


Ответы (1 шт):

Автор решения: 0xdb

В главе документации Logical Database Limits говорится:

Maximum number of partitions allowed per table or index -- 1024K-1

То есть: 1024 х 1024 - 1 = 1.048.575

При партиционировани по интервалу считаются все потенциальные партиции, то есть, если они ещё не созданы. Это значит, что они фактически предопределены. При интервале 1 будет: 0,1,2,3,...,1048574.

Другими словами, если вставить значение 1048574, то физически будут существовать только две партиции, одна начальная для 0 и одна для 1048574, но все партиции между ними пока существовуют условно для вставок, которые возможно будут позже: 1,2,3... и т.д.

Партиционирование по диапазону отличается. Его верхняя и нижняя границы точно определяются уже существующими партициями.

Та же ошибка будет, например, для партиционирования по интервалу 1 день. Для тех, кто не живёт сегодняшним днём, примите во внимание - 1048575 дней это чуть менее 2872 лет:

create table t (id int, created date)
partition by range (created) interval (numToDSInterval (1, 'day')) (
    partition def_part values less than (date'0001-01-01'));

insert into t values(1, date'2872-01-01');

ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions

→ Ссылка