转换为分区表时的初始数据块大小



在Linux x86/64上的Oracle 19c数据库中工作,尝试将非分区表转换为分区表。

从Oracle12开始,alter table modify partition就可以用于将未分区的表转换为分区表。我有一个未分区的表,其initial_extent大小设置为544MB。这太大了。实际的第一个扩展为8MB。

当我使用alter-table-modify分区时,我最终得到了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;

您可以为每个分区指定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 

最新更新