Oracle:使用自动列表分区和范围子分区

ber*_*ner 4 oracle database-partitioning oracle12c

我想使用分区方法将我的表分成两个维度:

  1. 第一个维度是键列表。该列表可以随着时间的推移而增长,如果键列表将被扩展,我不想需要 DBA 来添加分区。因此我想使用自动列表分区

  2. 第二个维度是日期列的每日范围。

这是我的例子,它给了我一个ORA-14179

CREATE TABLE PartitionedTable
( 
  id              number,
  PartitionKey    number,
  created         date
) 
PARTITION BY LIST (PartitionKey) AUTOMATIC
SUBPARTITION BY RANGE (created) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
( PARTITION p_PartitionKey VALUES (1)
  ( SUBPARTITION p_created VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy'))
  )
);
Run Code Online (Sandbox Code Playgroud)

我使用的是Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

如果插入新键和新日期,是否可以选择如何以最少的工作量创建这个二维分区表?

Chr*_*xon 5

问题是

子分区级别不支持间隔分区。

这同样适用于自动列表子分区 - 这也不受支持。所以你不能通过使用间隔自动分区来解决这个问题。因此,无论您做什么,您都需要进行子分区维护以拆分值。

如果您的目标是最小化(子)分区维护,那么使用间隔列表分区表可能会更好。使用列表值的默认分区。

您可以随时更改子分区模板。这定义了在您添加新的顶级分区时数据库创建的子分区。

例如,这将创建一个区间列表表:

create table partitionedtable ( 
  id              number,
  partitionkey    number,
  created         date
) 
partition by range (created) interval (numtodsinterval(1,'day'))
subpartition by list (partitionkey) 
subpartition template  (
  subpartition p1 values ( 1 ),
  subpartition pdef values ( default )
) ( 
  partition p2000 values less than ( date'2019-01-01' )
);

insert into partitionedtable values ( 1, 1, date'2019-01-02' );
insert into partitionedtable values ( 1, 2, date'2019-01-02' );
Run Code Online (Sandbox Code Playgroud)

值 2 位于默认子分区中。

您发现这一点并更新模板以包含一个子分区:

alter table partitionedtable
  set subpartition template (
    subpartition p1 values ( 1 ),
    subpartition p2 values ( 2 ),
    subpartition pdef values ( default )  
  );

insert into partitionedtable values ( 1, 1, date'2019-01-03' );
insert into partitionedtable values ( 1, 2, date'2019-01-03' );

select partition_name, subpartition_name, high_value 
from   user_tab_subpartitions;

PARTITION_NAME    SUBPARTITION_NAME    HIGH_VALUE   
P2000             P2000_P1             1             
P2000             P2000_PDEF           default       
SYS_P772          SYS_SUBP771          default       
SYS_P772          SYS_SUBP770          1             
SYS_P776          SYS_SUBP773          1             
SYS_P776          SYS_SUBP774          2             
SYS_P776          SYS_SUBP775          default   
Run Code Online (Sandbox Code Playgroud)

新分区 (SYS_P776) 有一个值为 2 的子分区。现有分区不变。如果您希望在此处的子分区中包含值为 2 的行,则需要拆分 SYS_P772。

假设创建 => 插入日期,这意味着您只需要在第一次插入和更改模板的日期之间拆分新分区键的子分区。

而对于自动范围分区,对于每个新的分区键,您需要管理新的日期子分区。

不过,像这样翻转分区方案还有其他含义。因此,在继续之前,请检查这是否符合您进行分区的其他原因(查询性能、数据归档等)。