Oracle11G新特性:分区表分区默认segment大小64k变为8M

2017-02-08

在oracle11.2创建分区表,每个分区默认大小为8M,是由_partition_large_extents参数控制,可以算是11.2.0.2开始的一个新特性,为了减少extent数量,提高分区表性能,而设置的一个参数,默认为true,即分区表的每个extent为8M,和oracle10g相比,会导致同样的数据耗费更多的表空间。

1、为了避免类似情况,可以设置_partition_large_extents参数为false.
SQL> alter system set "_partition_large_extents"=false;
SQL> alter system set "_partition_large_extents"=false scope=spfile;
SQL> alter system set "_partition_large_extents"=false scope=both;
create pfile from spfile;
SQL> show parameter _partition_large_extents;
SQL>select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_segments where tablespace_name like 'TS%' group by TABLESPACE_NAME;

2、
alter system set deferred_segment_creation=true;
show parameter deferred_segment_creation

3、通过测试证明,设置_partition_large_extents参数确实是能够控制分区表的extent大小,而且对于分区表,deferred_segment_creation虽然为true,但是在一个分区表中如果有一个子分区插入了记录,那么其他子分区会同时创建segment.对于数据量不多,而且数据大量集中在某几个分区,那强烈建议设置_partition_large_extents为false,节约空间.

4、如果数据量较大,而且数据分布较为均匀,建议设置_partition_large_extents为true.另外对于分区的index也有同样的参数为_index_partition_large_extents

5、Oracle中segment extent block
一个tablespace可以由多个datafile组成,一个datafile不能跨越多个tablespace。table中的数据,通过hash算法分布在tablespace中的各个datafile中,tablespace是逻辑上的概念,datafile则在物理上储存了数据库的种种对象。

Segment(段)、extent(区、 block(块)都是Oracle存储的物理概念名称
BLOCK是Oracle存储的最基本单位,由DB_BLOCK_SIZE制定,通常为8KB,也可以定义为2KB,4KB,16KB,32KB,64KB等,磁盘最小存储单位是sector(512BYTE 操作系统概念),Oracle数据块由连续的sector组成,Oracle读写单位是数据块,应尽量设置BLOCK大小为磁盘数据块大小的整数倍,避免IO浪费

连续的数据块组成一个分区extent,便于空间管理,包括空间的分配和释放。段的空间是以区为单位分配的。提高了分配空间的效率,但是带来了空间碎片。

Oracle每个表或索引都会对应这一个段。如果使用分区表或者分区索引,每个分区(partition)都对应着一个段。每个段都有名字,即对象(表、索引)的名字,段由extent组成,但不要求连续。

一个table至少是一个segment,如果分区表,则每个分区是一个segment,table可以看成是一个逻辑上的概 念,segment可以看成是这个逻辑概念的物理实现;segment由一个或多个extents组成,segment不可以跨表空间但可以跨数据文件;extent由多个连续的blocks组成,不可以跨数据文件;block由1-多个os块组成,是oracle i/o的最小存储单位。

deferred_segment_creation在11.2.0.4版本的Oracle数据库新增参数,默认是true。

这会导致在exp时,没有segment的对象不会导出。

create table table_name segment creation immediate;

alter table table_name allocate extent来使其创建出分配空间,

6、查看分区表空间大小:
select segment_name, sum(bytes)/1024/1024 from User_Extents where segment_name in (select distinct table_name from user_tab_partitions) group by segment_name;

空置率
select a.tablespace_name,a.free_space,b.total_space,a.free_space/b.total_spacefree_ratio from (select tablespace_name,sum(bytes)/1024/1024 free_space from dba_free_space group by tablespace_name) a,(select tablespace_name,sum(bytes)/1024/1024 total_space from dba_data_files group by tablespace_name) b where a.tablespace_name=b.tablespace_name order by free_ratio desc

分类:数据库 | 标签: |

相关日志

评论被关闭!