在 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?
你想完全摆脱分裂。它们的执行成本昂贵且具有侵入性。请按照以下步骤操作:
MAXVALUE
分区中有任何数据,请将其拆分到新的 Jan 分区,这样您就不会丢失该数据。MAXVALUE
分区,并且不再创建它。如果您的分区键数据类型是日期:
alter table xyz set interval(numtoyminterval(1,'MONTH'))
如果您的数据类型是代表日期的数字:
alter table xyz set interval(100)
(只要您没有 1900 年代的任何日期就可以使用,因为可能会超过 Oracle 的最大分区计数)。如果您进行子分区,这可能会进一步限制您允许的日期范围,因此希望您使用的是真实日期并且不需要这样做。
但是,如果您的数据类型是表示日期的
varchar2
字符串,或者该列曾经使用 12/01/9999
-12/31/9999
范围内的虚拟值,则您将无法使用区间分区。在这种情况下,只需手动预先创建分区(1 年的价值)。您可以更进一步并创建一个脚本来按计划自动执行此操作。但如果可能的话,应该使用区间分区。
现在,当插入语句添加一个不属于现有分区之一的新值时,它将自动动态创建所需的新分区。