oracle-如果已经删除了相应的间隔,那么如何在分区表中处理行?

tvokkenx  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(327)

我有一个基于范围分区架构进行分区的现有表:

create table History(
hid number(19,0),
type varchar2(255 char),
lastupdated timestamp (6) not null enable,
name varchar2(255 char),
primary key (hid))
partition by range (lastupdated) interval (numtodsinterval(1,'day'))
(partition retailhistory values less than (to_timestamp('12/01/2020','DD/MM/YYYY')));

我的目标是创建一个过程,可以在15天之前删除旧分区。作为要求,我已经开发了一个程序,其中删除最后一个分区也,我。e。retailhistory,以及系统生成的分区。现在我想到了一个问题,既然间隔分区的下限现在已经改变了,那个么如果我再次为丢弃的分区插入数据会发生什么呢,
比方说,在上面的例子中,零售历史的分区现在被删除,然后我想插入一个带有时间戳(11/01/2020)的数据,因为分区的开始日期是1月12日。
如何将这些数据分配给分区。我可以看到行现在已经插入到表中,但是我看不到为此日期创建的系统生成的分区。任何帮助都将不胜感激。谢谢。:)
编辑:我使用以下技术删除了分区:
alter table history set interval(numtodsinterval(1,'day'));
然后
alter表历史删除分区零售历史更新索引;
retailhistory分区存储1月12日之前的数据。删除此分区后,下一个系统生成的分区将变为下限。
现在我想插入时间戳为1月1日的数据,所以如何处理它。

yyhrrdl8

yyhrrdl81#

您可以通过以下查询查看它分配给每行数据的分区:

select h.lastupdated, uo.subobject_name
from history h
join user_objects uo on uo.data_object_id = dbms_rowid.rowid_object(h.rowid);

插入的行将进入具有最低的分区 high_value 这比您插入的日期2020-01-11要大。如果您保留了分区,比如说,日期在2月份,而删除了1月份的所有分区,那么插入2020-01-11将与2020-02-01上的时间戳放在同一个分区中。这个 high_value 这将是2020-02-02 00:00:00;你的数据在那之前,所以它会在那一个。
db<>小提琴演示
删除此分区后,下一个系统生成的分区将变为下限。
不,这不是下限。
根据文件:
每个分区都有一个values-less-than子句,它为分区指定一个非包含的上限。任何等于或高于此文本的分区键值都将添加到下一个更高的分区。除第一个分区外,所有分区都有一个由上一个分区的values less than子句指定的隐式下限。
下一个系统生成的分区变为最低下限上限
删除旧分区后,新的“first”分区仍然没有下限,因此任何较早的值都将放在该存储桶中。
在你原来的table上 retailhistory 分区,如果在此之前插入了一个值-例如。 timestamp 1999-12-31 -那么这个值也会在分区中,因为这个值小于2020-01-12。
所有其他系统生成的分区正好覆盖一天,但是第一个分区可以返回任意天数。

相关问题