暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何根据日期字段创建12个月的循环子分区?

ASKTOM 2019-07-30
1146

问题描述

亲爱的甲骨文团队:

我有一个表,其中有2个重要列,一个是年份,另一个是日期。由于表的体积非常高,我们计划根据年列 (即数字 (4) 类型) 对表进行分区,并使用日期字段按月进行子分区。

我从Oracle文档中了解到,以及在浏览此空间更多时间后,我们无法在子分区级别创建自动分区。
我看到了一些提供的解决方案,但找不到与我的情况匹配的解决方案。

你能帮我吗?

下面给出了我的表结构

CREATE TABLE t_partition (
  p_id             NUMBER,
  p_year           NUMBER(4),-- eg 2018
  p_signed_day     DATE,
  p_signed_user    VARCHAR2(10)
)


在这里,我需要基于p_year的主分区为每年自动分区,然后使用p_signed_day字段每年每年创建12个子分区 (每月一个)。

我考虑过使用子分区模板,但是无法在设置子分区子句时从日期字段中获取月份信息。

我怎样才能做到这一点?

谢谢
K R

专家解答

可能最简单的方法是:

-定义一个虚拟列从日期中提取月份
-这个上的分区
-创建一个列出月份值的分区模板

然后,当添加新的顶级分区时,您将为它们获得一个子分区/月:

create table t (
  ins_date  date,
  ins_year  int as ( extract ( year from ins_date ) ),
  ins_month int as ( extract ( month from ins_date ) )
) partition by range ( ins_year )
  interval ( 1 )
  subpartition by list ( ins_month ) 
  subpartition template (
    subpartition sp_jan values ( 1 ), 
    subpartition sp_feb values ( 2 ), --etc.
    subpartition sp_others values ( default )
  ) (
    partition p2019 values less than ( 2020 )
  );
  
insert into t ( ins_date ) values ( date'2020-01-01' );

select * from t;

INS_DATE                INS_YEAR    INS_MONTH   
01-JAN-2020 00:00:00           2020            1 

select partition_name, subpartition_name
from   user_tab_subpartitions
where  table_name = 'T';

PARTITION_NAME    SUBPARTITION_NAME   
P2019             P2019_SP_JAN         
P2019             P2019_SP_FEB         
P2019             P2019_SP_OTHERS      
SYS_P8460         SYS_SUBP8458         
SYS_P8460         SYS_SUBP8459         
SYS_P8460         SYS_SUBP8457   


虽然我不得不问: p_year是从p_signed_day派生的吗?如果是这样,您最好也将其作为虚拟列 (如我的示例)。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论