如何为已经分区的表创建未来的分区

问题描述 投票:0回答:1

在 Oracle DB 中为已经分区的表

TBLDATA
有两个索引(
TBLDATA~1
TBLDATA~2
)创建分区最合适的方法是什么?

我的表由

TBLDATA_MIN_PART
TBLDATA_MAX_PART
以及自该表开始分区以来创建的所有每月分区组成。 (最后一个分区 - 2023 年 12 月的
tbldata_202312_part

到目前为止,我们回顾性地将

tbldata_max_part
分为子分区:

ALTER TABLE schema.tbldata SPLIT PARTITION tbldata_max_part AT ('20240101') INTO (PARTITION tbldata_202312_part TABLESPACE TBLSPC3 NOCOMPRESS, PARTITION tbldata_max_part);

之后:

ALTER INDEX schema."TBLDATA~1" REBUILD PARTITION tbldata_202312_part TABLESPACE TBLSPC3 NOCOMPRESS;
ALTER INDEX schema."TBLDATA~2" REBUILD PARTITION tbldata_202312_part TABLESPACE TBLSPC3 NOCOMPRESS;

我现在想创建 2024 年全年的未来分区,哪种方式最合适?

我可以拆分到 2024 年 1 月分区 -

tbldata_max_part
之后将为空,但是数据库会自动将 JAN2024 数据分配到 1 月分区还是再次分配到 maxpart?

oracle database-administration table-partitioning
1个回答
0
投票

你想完全摆脱分裂。它们的执行成本昂贵且具有侵入性。请按照以下步骤操作:

  1. 如果您的
    MAXVALUE
    分区中有任何数据,请将其拆分到新的 Jan 分区,这样您就不会丢失该数据。
  2. 删除您的
    MAXVALUE
    分区,并且不再创建它。
  3. 在桌子上设置一个间隔:

如果您的分区键数据类型是日期:

alter table xyz set interval(numtoyminterval(1,'MONTH'))

如果您的数据类型是代表日期的数字:

alter table xyz set interval(100)
(只要您没有 1900 年代的任何日期就可以使用,因为可能会超过 Oracle 的最大分区计数)。如果您进行子分区,这可能会进一步限制您允许的日期范围,因此希望您使用的是真实日期并且不需要这样做。

但是,如果您的数据类型是表示日期的

varchar2
字符串,或者该列曾经使用
12/01/9999
-
12/31/9999
范围内的虚拟值,则您将无法使用区间分区。在这种情况下,只需手动预先创建分区(1 年的价值)。您可以更进一步并创建一个脚本来按计划自动执行此操作。但如果可能的话,应该使用区间分区。

现在,当插入语句添加一个不属于现有分区之一的新值时,它将自动动态创建所需的新分区。

© www.soinside.com 2019 - 2024. All rights reserved.