现象一描述:
在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
);