问题描述
嗨,汤姆,
有以下用例。
并得到错误
因此,甲骨文似乎试图创建所有分区,直到宇宙结束。
有什么想法如何防止这种情况吗?
因此,在许多情况下,“31/12/9999 23:59:59.000000” 被标记为当前的valid_unt。
谢谢
亨德里克
有以下用例。
DROP TABLE gaga1;
CREATE TABLE gaga1 (abc TIMESTAMP)
PARTITION BY RANGE (abc)INTERVAL ( NUMTODSINTERVAL (1, 'DAY') )( PARTITION OLD_DATA VALUES LESS THAN (TIMESTAMP '2015-01-01 00:00:00.000000'));
INSERT INTO gaga1 select to_timestamp('31/12/9999 23:59:59.000000','DD/MM/YYYY HH24:MI:SS.FF') from dual ;并得到错误
ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions
因此,甲骨文似乎试图创建所有分区,直到宇宙结束。
有什么想法如何防止这种情况吗?
因此,在许多情况下,“31/12/9999 23:59:59.000000” 被标记为当前的valid_unt。
谢谢
亨德里克
专家解答
我希望宇宙能持续一个bit超过另外8000年;)
在间隔分区表中插入新的分区键值时,数据库需要为从该值到当前较低值的所有分区 “腾出空间”。
在这种情况下,这是:
近300万个分区。分区数上限的三倍左右 (2 ** 20 ~ 100万)!
一些解决方法:
Move the lower or upper bounds
我猜你不能比2015年1月1日更早移动下限。所以你需要把你的 “宇宙的尽头” 移得更近,到4,000年左右!
无论如何,请注意,您不能将9999年12月31日的值用于 “结束”。
因为如果这样做,数据库需要将最后一个分区的上限设置为1月1日10,000。Oracle数据库中不可能的日期!
Change the granularity
而不是每日分区,你使用每周 (7天) 你有足够的空间来存储所有你想要的日期:
不过请注意,这里的最大值移回9999年12月29日。
Change the granularity & subpartition
如果你must有每日分区,你可以按月/周/...然后按天分区。
当前不支持间隔子分区。相反,您可以:
-添加一个虚拟列,从日期中提取日期编号
-这个VC的次分区
-定义一个子分区模板,该模板为顶层粒度的每一天创建一个子分区
例如:
在间隔分区表中插入新的分区键值时,数据库需要为从该值到当前较低值的所有分区 “腾出空间”。
在这种情况下,这是:
select date'9999-12-31' - date'2015-01-01' days from dual; DAYS 2,916,460
近300万个分区。分区数上限的三倍左右 (2 ** 20 ~ 100万)!
一些解决方法:
Move the lower or upper bounds
我猜你不能比2015年1月1日更早移动下限。所以你需要把你的 “宇宙的尽头” 移得更近,到4,000年左右!
无论如何,请注意,您不能将9999年12月31日的值用于 “结束”。
因为如果这样做,数据库需要将最后一个分区的上限设置为1月1日10,000。Oracle数据库中不可能的日期!
Change the granularity
而不是每日分区,你使用每周 (7天) 你有足够的空间来存储所有你想要的日期:
CREATE TABLE gaga1 (abc TIMESTAMP)
PARTITION BY RANGE (abc)
INTERVAL ( NUMTODSINTERVAL (7, 'DAY') ) (
PARTITION OLD_DATA VALUES LESS THAN (TIMESTAMP '2015-01-01 00:00:00.000000')
);
INSERT INTO gaga1 select to_timestamp('29/12/9999 23:59:59.000000','DD/MM/YYYY HH24:MI:SS.FF') from dual;
SELECT COUNT(*) FROM gaga1;
COUNT(*)
1 不过请注意,这里的最大值移回9999年12月29日。
Change the granularity & subpartition
如果你must有每日分区,你可以按月/周/...然后按天分区。
当前不支持间隔子分区。相反,您可以:
-添加一个虚拟列,从日期中提取日期编号
-这个VC的次分区
-定义一个子分区模板,该模板为顶层粒度的每一天创建一个子分区
例如:
CREATE TABLE gaga1 (
abc TIMESTAMP,
abc_day INT as (extract (day from abc) )
) PARTITION BY RANGE (abc)
INTERVAL ( INTERVAL '1' MONTH )
SUBPARTITION BY LIST ( abc_day )
SUBPARTITION TEMPLATE (
subpartition sp1 values ( 1 ),
subpartition sp2 values ( 2 )
-- etc.
) (
PARTITION OLD_DATA VALUES LESS THAN (TIMESTAMP '2015-01-01 00:00:00.000000')
); 文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




