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你就会

  • nulldummy

    没有问题
  • 列不会改变,所以不需要行移动

  • 大多数查询使用谓词 :1 >= valid_from,因此 修剪 将正常工作

要高效访问 open(最新)版本,您可以使用 复合分区validfrom 日期 范围分区列表子分区用于开放/封闭版本。