Oracle数据库学习_Oracle分区表的分区占用空间为什么是8M?如何修改分区的初始空间?

现象一描述:

在oracle12c下创建一个分区表T_A_TRADING,新建一个分区P1,P1里没有任何纪录时,查user_segments表发现 PARTITION_name='P1'结果返回Null,说明此时P1是没有分配空间的。

现象二描述:

当给分区P1仅插入一条记录时,查user_segments表发现 PARTITION_name='P1'结果返回:

segment_name  partition_name  (bytes/1024/1024)

---------------------------------------------------------------------------------------

T_A_TRADING  P20200220     8

发现这个分区占用的空间达到了8M,尽管只有一条记录。

原因分析:

上面两种现象的发生是由oracle12C的延迟段特性造成的,下面详细介绍一下这个特性的由来和用法。

11gR2之前的版本中,当创建一张表时,会自动分配段空间。

  • 创建普通表时,每个分区默认占用空间大小为0.0625m(64k)。
  • 创建分区表时,每个分区默认占用空间大小为8M,是由_partition_large_extents参数控制,可以算是11.2.0.2开始的一个新特性,为了减少extent数量,提高分区表性能,而设置的一个参数,默认为true,即分区表的每个extent为8M。
  • 创建普通索引和分区索引的默认大小也是64k,由系统参数_index_partition_large_extents控制(true-开;false-关),默认为true。

这样做有几个弊端:

1. 初始创建表时就需要分配空间,自然会占用一些时间,如果初始化多张表,这种影响就被放大。

2. 如果很多表开始的一段时间都不需要,那么就会浪费这些空间。

3. 如果数据量较大,而且数据分布较为均匀,建议设置_partition_large_extents为true。

为此,从11gR2开始,有一种新特性,叫延迟段,即延迟分配段空间。简单讲,默认将表(以及索引、LOB)的物理空间分配推迟到第一条记录插入到表中时。即有实际的数据插入表中时,再为每个对象初始化空间分配。延迟段是否开启由系统参数deferred_segment_creation决定(true-开;false-关)。

修改分区初始空间的办法:

一、可以通过修改这个系统参数来改变分区的初始空间。

参数修改语句:

alter system set "_parition_large_extents"=false scope = both

有人指出,这个修改需要修改数据库的安装指导和统装脚本,然后再加上这个参数的修改才行。

有位博主测试过这种方法,最后他发现_partition_large_extents参数确实是能够控制分区表的extent大小,链接:https://www.cnblogs.com/wcwen1990/p/6656545.html。

我没有试过这种方法,感觉危险系数较高。。。

二、指定分区表分区初始大小,参考非分区表的初始空间很小,为64K。

create table t_testuser
(
operateid number(20) not null,
logtime date default cast(current_timestamp at time zone '00:00' as date) not null
)

-- 创建分区
partition by range(logtime)
(
partition beforedata values less than (to_date('2019-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition P20190110 values less than (to_date('2019-01-10 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition P20190115 values less than (to_date('2019-01-15 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition P20190120 values less than (to_date('2019-01-20 00:00:00','yyyy-mm-dd hh24:mi:ss'))
)
tablespace ring  --一般方法建分区使用默认的初始空间8M,不用加后面的设置语句;
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);

原文地址:https://www.cnblogs.com/tongying/p/13343497.html