Oracle 我是否可以使用默认/maxvalue分区创建一个不断增长的间隔分区表?

Oracle 我是否可以使用默认/maxvalue分区创建一个不断增长的间隔分区表?,oracle,oracle12c,database-partitioning,Oracle,Oracle12c,Database Partitioning,问题摘要:创建具有范围分区的分区的表。但是,不知道范围值的记录应位于不同的(默认)分区中,并在填充值时移动到正确的分区。默认分区将永远不会被删除,而其他分区将通过脚本在定义的保留期后被删除 整个故事: 我有一个表,其中记录必须放在基于日期字段的分区中。这是一个不断增长的表,一段时间后,可以清除这些分区中的数据。我曾经用下面的代码片段创建表 这很好,因为我们知道我们分区(RDATE)所基于的日期列的值。然而,在我们的新项目中,插入记录时我们不知道这一点。该值最终将在应用程序处理过程中填写 我最初的

问题摘要:创建具有范围分区的分区的表。但是,不知道范围值的记录应位于不同的(默认)分区中,并在填充值时移动到正确的分区。默认分区将永远不会被删除,而其他分区将通过脚本在定义的保留期后被删除

整个故事:

我有一个表,其中记录必须放在基于日期字段的分区中。这是一个不断增长的表,一段时间后,可以清除这些分区中的数据。我曾经用下面的代码片段创建表

这很好,因为我们知道我们分区(RDATE)所基于的日期列的值。然而,在我们的新项目中,插入记录时我们不知道这一点。该值最终将在应用程序处理过程中填写

我最初的想法是创建MAXPARTITION(MAXVALUE),它将是一个包含所有未填充日期的记录的分区,并启用行移动,以便在填充日期时将其移动到适当的分区中。但是,我认为不可能同时使用MAXVALUE分区和区间分区。是这样吗

还有更好的方法吗

PARTITION BY RANGE ("RDATE") INTERVAL (NUMTODSINTERVAL (1,'DAY')) 
SUBPARTITION BY HASH ("RKEY") 
SUBPARTITION TEMPLATE ( 
   SUBPARTITION "SP01", 
   SUBPARTITION "SP02", 
   SUBPARTITION "SP03", 
   SUBPARTITION "SP04", 
   SUBPARTITION "SP05", 
   SUBPARTITION "SP06", 
   SUBPARTITION "SP07", 
   SUBPARTITION "SP08", 
   SUBPARTITION "SP09", 
   SUBPARTITION "SP10", 
   SUBPARTITION "SP11", 
   SUBPARTITION "SP12", 
   SUBPARTITION "SP13", 
   SUBPARTITION "SP14", 
   SUBPARTITION "SP15", 
   SUBPARTITION "SP16" ) 
(PARTITION "INITIALPARTITION"  VALUES LESS THAN (TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 

当列被填充时,我希望具有默认分区和范围分区以及记录的表从默认分区移动到范围分区。

用作分区键的列不能为空,但可以使用如下解决方法:

CREATE TABLE ... (
    ...
    RDATE DATE,
    PARTITION_KEY DATE GENERATED ALWAYS AS (COALESCE(RDATE, DATE '1969-12-31')) 
)
PARTITION BY RANGE (PARTITION_KEY) INTERVAL (NUMTODSINTERVAL (1,'DAY'))
...
(PARTITION INITIAL_PARTITION VALUES LESS THAN (DATE '1970-01-01'))
ENABLE ROW MOVEMENT;
如果插入的记录
RDATE=NULL
,则它将被插入到分区初始分区中。对于初始数据(例如1970-01-01),您必须选择一个不会落入“真实”日期值的值。你也可以在遥远的将来使用日期,例如

CREATE TABLE ... (
    ...
    RDATE DATE,
    PARTITION_KEY DATE GENERATED ALWAYS AS (COALESCE(RDATE, DATE '2999-12-31')) 
)
PARTITION BY RANGE (PARTITION_KEY) INTERVAL (NUMTODSINTERVAL (1,'DAY'))
...
(PARTITION INITIAL_PARTITION VALUES LESS THAN (DATE '2019-04-01'))
ENABLE ROW MOVEMENT;

-- Create DEFAULT_PARTITION
INSERT INTO ... (RDATE) VALUES (NULL);
ROLLBACK;
ALTER TABLE ... RENAME PARTITION FOR (TIMESTAMP '2999-12-31 00:00:00') TO DEFAULT_PARTITION;

“不知道范围值的记录应该驻留在默认分区中”是什么意思?这是否意味着
RDATE
值为
NULL
?是的,最初该值不可用。这更像是一个到期日。然而,在这种情况下,到期日期可以留空,并最终填写。我仍然不清楚您的问题。它是到期日还是空值(即空值)。不能两者兼而有之。如果我的语言混乱,我道歉。插入记录时,RDATE值未知。但是,应用程序会在特定时间点更新RDATE。RDATE是我希望分区基于的列。最初为空,但将被填写。谢谢您的回答。不过我有几个问题:1)您建议引入一个新的列分区键。是否应将其声明为NOTNULL?2) 在几乎所有情况下,RDATE最初都是空的,因此如果它为空(比如1970-01-01),那么设置一个默认值并继续使用RDATE作为分区键是否更有意义?