ORA-14300: 分区键映射到超出最大允许分区数的分区
ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions
我在下面 table 创建了分区:
CREATE TABLE FRD_TBL_H (DAT NUMBER(8), DATST NUMBER(8), MEST VARCHAR2(1 CHAR), MEST1 VARCHAR2(1 CHAR), BELD CHAR(11 CHAR),VALID_FROM DATE, VALID_TO DATE)
PARTITION BY RANGE(valid_to)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
( PARTITION p0 VALUES LESS THAN (TO_DATE('01-01-1999', 'DD-MM-YYYY')))
ENABLE ROW MOVEMENT;
我正在尝试通过将 valid_to 值保持为 null 来将数据插入到此 table 中,我还尝试将 valid_to 值设为“01-01-1999”,但出现以下错误:
ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions
我在 valid_to 列上按月进行了分区,因为 table 有 7000 万行,我在下面写的只是对历史化逻辑的查询:
MERGE INTO FRD_TBL_H e
USING FRD_TBL h
ON (e.beld = h.beld)
WHEN MATCHED THEN
UPDATE SET e.valid_from = sysdate
where e.valid_to = 01.01.1999
Oracle 中的最大分区数是1024K - 1 = 1048575
你可能正在做以下事情。您使用 day 分区创建了 table。 (不是你发布的月份)。
CREATE TABLE FRD_TBL_H (DAT NUMBER(8), DATST NUMBER(8), MEST VARCHAR2(1 CHAR), MEST1 VARCHAR2(1 CHAR), BELD CHAR(11 CHAR),VALID_FROM DATE, VALID_TO DATE)
PARTITION BY RANGE(valid_to)
INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
( PARTITION p0 VALUES LESS THAN (TO_DATE('01-01-1999', 'DD-MM-YYYY')))
ENABLE ROW MOVEMENT;
并使用 足够高 valid_to
日期,例如DATE'4999-01-01'
insert into FRD_TBL_H( VALID_TO) values (DATE'4999-01-01');
ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions
一个简单的计算表明,分区限制确实被打破了
select 1024*1024-1 max_part, DATE'4999-01-01' - TO_DATE('01-01-1999', 'DD-MM-YYYY') day_diff from dual;
MAX_PART DAY_DIFF
---------- ----------
1048575 1095728
所以这是预期的行为。
真正的问题是,为什么使用 valid_to
作为 分区键 而不是 valid_from
.
有了valid_from
你就会
null
或 dummy 值
没有问题
列不会改变,所以不需要行移动
大多数查询使用谓词 :1 >= valid_from
,因此 修剪 将正常工作
要高效访问 open(最新)版本,您可以使用 复合分区 和 validfrom
日期 范围分区和列表子分区用于开放/封闭版本。
我在下面 table 创建了分区:
CREATE TABLE FRD_TBL_H (DAT NUMBER(8), DATST NUMBER(8), MEST VARCHAR2(1 CHAR), MEST1 VARCHAR2(1 CHAR), BELD CHAR(11 CHAR),VALID_FROM DATE, VALID_TO DATE)
PARTITION BY RANGE(valid_to)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
( PARTITION p0 VALUES LESS THAN (TO_DATE('01-01-1999', 'DD-MM-YYYY')))
ENABLE ROW MOVEMENT;
我正在尝试通过将 valid_to 值保持为 null 来将数据插入到此 table 中,我还尝试将 valid_to 值设为“01-01-1999”,但出现以下错误:
ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions
我在 valid_to 列上按月进行了分区,因为 table 有 7000 万行,我在下面写的只是对历史化逻辑的查询:
MERGE INTO FRD_TBL_H e
USING FRD_TBL h
ON (e.beld = h.beld)
WHEN MATCHED THEN
UPDATE SET e.valid_from = sysdate
where e.valid_to = 01.01.1999
Oracle 中的最大分区数是1024K - 1 = 1048575
你可能正在做以下事情。您使用 day 分区创建了 table。 (不是你发布的月份)。
CREATE TABLE FRD_TBL_H (DAT NUMBER(8), DATST NUMBER(8), MEST VARCHAR2(1 CHAR), MEST1 VARCHAR2(1 CHAR), BELD CHAR(11 CHAR),VALID_FROM DATE, VALID_TO DATE)
PARTITION BY RANGE(valid_to)
INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
( PARTITION p0 VALUES LESS THAN (TO_DATE('01-01-1999', 'DD-MM-YYYY')))
ENABLE ROW MOVEMENT;
并使用 足够高 valid_to
日期,例如DATE'4999-01-01'
insert into FRD_TBL_H( VALID_TO) values (DATE'4999-01-01');
ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions
一个简单的计算表明,分区限制确实被打破了
select 1024*1024-1 max_part, DATE'4999-01-01' - TO_DATE('01-01-1999', 'DD-MM-YYYY') day_diff from dual;
MAX_PART DAY_DIFF
---------- ----------
1048575 1095728
所以这是预期的行为。
真正的问题是,为什么使用 valid_to
作为 分区键 而不是 valid_from
.
有了valid_from
你就会
没有问题null
或 dummy 值列不会改变,所以不需要行移动
大多数查询使用谓词
:1 >= valid_from
,因此 修剪 将正常工作
要高效访问 open(最新)版本,您可以使用 复合分区 和 validfrom
日期 范围分区和列表子分区用于开放/封闭版本。