При партиционировании по интервалу ошибка: 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 шт):
В главе документации 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