簡體   English   中英

Oracle - 如果已刪除相應的間隔,如何在分區表中處理行?

[英]Oracle - How the rows are handled in partitioned table, if the respective interval is already dropped?

我有一個基於范圍分區架構分區的現有表:

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 天之前。 作為要求,我開發了一個程序,它也刪除了最后一個分區,即retailhistory,系統生成的分區。 現在我想到了一個問題,既然間隔分區的最低界限現在改變了,如果我再次插入刪除分區的數據會發生什么,

比如說,在上述情況下,現在刪除了零售歷史分區,然后我想插入一個帶有時間戳(2020 年 11 月 1 日)的數據,因為分區的開始日期是 1 月 12 日。

現在如何將這些數據分配給分區。 我可以看到該行現在已插入表中,但我看不到為該日期創建的系統生成分區。 任何幫助,將不勝感激。 謝謝。 :)

編輯:我使用以下技術刪除了分區:

更改表歷史設置間隔 (numtodsinterval(1,'day'));

然后

更改表歷史記錄刪除分區零售歷史更新索引;

Retailhistory 分區存儲 1 月 12 日之前的數據。刪除此分區后,下一個系統生成的分區變為下限。

現在我想插入帶有時間戳的數據,比如 1 月 1 日。 那么將如何處理。

您可以使用如下查詢查看它分配給的每一行數據的分區:

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

您插入的行將 go 插入具有最低high_value且大於您插入日期 2020-01-11 的任何分區。 如果您保留了 2 月份日期的分區並在 1 月份刪除了所有日期,那么插入 2020-01-11 將 go 與 2020-02-01 的時間戳在同一分區中。 high_value為 2020-02-02 00:00:00; 你的數據在那之前,所以它會在那個 go 中。

db<>小提琴演示


刪除此分區后,下一個系統生成的分區將變為下限。

不,這不是下限。

從文檔中

每個分區都有一個 VALUES LESS THAN 子句,它為分區指定一個不包含在內的上限。 等於或高於此文字的分區鍵的任何值都將添加到下一個更高的分區。 除第一個分區外,所有分區都具有由前一個分區的 VALUES LESS THAN 子句指定的隱式下限。

下一個系統生成的分區變為 最低上限

刪除舊分區后,新的“第一個”分區仍然沒有下限,因此該存儲桶中的任何早期值都將是 go。

在僅具有retailhistory分區的原始表中,如果您在此之前插入了一個值(例如timestamp 1999-12-31 ),那么該值仍然會出現在該分區中,因為該值小於 2020-01-12。

所有其他系統生成的分區恰好覆蓋一天,但第一個分區可以 go 在任意天數內返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM