oracle - 转换为分区表时的初始范围大小

标签 oracle partitioning partition database-partitioning oracle19c

在 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;

最佳答案

您可以指定 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 

关于oracle - 转换为分区表时的初始范围大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67642490/

相关文章:

oracle - 列出 oracle 中用户 View 的列名

oracle - JNDI 与 Spring 集成时出错

linux - 如果文件的大小超过了文件系统的最大大小,会发生什么?

date - BigQuery (BQ) - 删除分区

mysql - 如何使用 YEAR MONTH DAY HOUR 作为分区形式时间戳列对 MYSQL 进行分区

sql - 如何在 Oracle 中对 CLOB 列使用 GROUP BY?

sql-server - SQL Server如何实现数据自动归档?

mysql - 在 MySQL 分区表上选择未选择正确的分区

将图划分为组的算法

sql - 如何获取不在oracle select sql中的GROUP BY子句中的其他列?