问题描述
亲爱的甲骨文团队:
我有一个表,其中有2个重要列,一个是年份,另一个是日期。由于表的体积非常高,我们计划根据年列 (即数字 (4) 类型) 对表进行分区,并使用日期字段按月进行子分区。
我从Oracle文档中了解到,以及在浏览此空间更多时间后,我们无法在子分区级别创建自动分区。
我看到了一些提供的解决方案,但找不到与我的情况匹配的解决方案。
你能帮我吗?
下面给出了我的表结构
在这里,我需要基于p_year的主分区为每年自动分区,然后使用p_signed_day字段每年每年创建12个子分区 (每月一个)。
我考虑过使用子分区模板,但是无法在设置子分区子句时从日期字段中获取月份信息。
我怎样才能做到这一点?
谢谢
K R
我有一个表,其中有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
专家解答
可能最简单的方法是:
-定义一个虚拟列从日期中提取月份
-这个上的分区
-创建一个列出月份值的分区模板
然后,当添加新的顶级分区时,您将为它们获得一个子分区/月:
虽然我不得不问: p_year是从p_signed_day派生的吗?如果是这样,您最好也将其作为虚拟列 (如我的示例)。
-定义一个虚拟列从日期中提取月份
-这个上的分区
-创建一个列出月份值的分区模板
然后,当添加新的顶级分区时,您将为它们获得一个子分区/月:
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




