转换为分区表时的初始扩展区大小
Posted
技术标签:
【中文标题】转换为分区表时的初始扩展区大小【英文标题】:Initial extent size when converting to partitioned table 【发布时间】:2021-08-11 00:18:27 【问题描述】:在 Linux x86/64 上的 Oracle 19c 数据库中工作,尝试将非分区表转换为分区表。
自 Oracle12 以来,alter table modify partition 可用于将非分区表转换为分区表。我有一个非分区表,其 initial_extent 大小设置为 544MB。这太大了。实际的第一个区段是 8MB。
当我使用 alter table modify partition 时,我最终得到了 90 个分区,所有分区的初始范围都是 544MB。这导致表的大小增加了三倍。许多分区有 90% 以上是空的。
问题是这样的。在此过程中如何将初始分区范围大小设置为合理的值?
使用 alter table move 用新存储重新创建表并不是一个真正有用的步骤,因为其中一些表的大小超过了 TB。也许我错过了它,但我找不到更改或指定初始范围大小的方法。我可以在事后更改表移动分区并重建所有索引,但这与在分区之前更改表移动具有相同的问题。
ALTER TABLE mytable MODIFY
Partition by range (mydatecol)
interval ( NUMTOYMINTERVAL(1,'MONTH') )
(
partition p1308 values less than (to_date('01-SEP-2013','dd-mon-yyyy'))
)
-- Below line will raise "ORA-02203: INITIAL storage options not allowed"
-- storage( initial 1m)
UPDATE INDEXES ONLINE;
【问题讨论】:
【参考方案1】:您可以为每个分区指定storage
子句:
create table t (
c1 int
) storage ( initial 10m );
insert into t
with rws as (
select level x from dual
connect by level <= 5
)
select x from rws;
commit;
alter table t modify
partition by range ( c1 )
interval ( 1 ) (
partition p1 values less than ( 2 )
storage ( initial 8k ),
partition p2 values less than ( 3 )
storage ( initial 64k ),
partition p3 values less than ( 4 )
storage ( initial 128k )
);
select partition_name, initial_extent
from user_tab_partitions
where table_name = 'T';
PARTITION_NAME INITIAL_EXTENT
P1 16384
P2 65536
P3 131072
SYS_P42018 10485760
SYS_P42019 10485760
请注意,您必须对所有分区执行此操作。自动创建的间隔分区将具有与原始表相同的初始值。任何新分区也将具有相同的初始大小。您可以使用 modify default attributes
子句更改它:
insert into t values ( 6 );
alter table t modify
default attributes storage ( initial 16k );
insert into t values ( 7 );
select partition_name, initial_extent
from user_tab_partitions
where table_name = 'T';
PARTITION_NAME INITIAL_EXTENT
P1 16384
P2 65536
P3 131072
SYS_P42018 10485760
SYS_P42019 10485760
SYS_P42020 10485760
SYS_P42021 16384
【讨论】:
有趣,这可能有效。需要在修改命令中注明所有分区是唯一的缺点。 正确;你总是可以写一个脚本来生成alter table语句以上是关于转换为分区表时的初始扩展区大小的主要内容,如果未能解决你的问题,请参考以下文章