三 区(extent) Ø 概述 ·又称范围,是一组表空间内连续分配的相临数据块 ·是数据库分配disk空间的最小逻辑单位,也是表中数据增长的基本单位 ·一个oracle对象包含至少一个数据区 Ø 区的storage分配参数 initial: 段建立时被分配的第一个区(第一块空间)的大小 next: 段被分配的第二个区的大小 minextents: 段被分配的区个数下限 maxextents: 段被分配的区个数上限 pct-increase:从第3个分区开始,段被分配的新区比前一个分配的分区扩大到百分比 uniform管理方式下,表空间的extent分配原则是:initial,next值固定为uniform指定值,min,max,pct参数自动设置默认值(分别为1,2^31,0);表空间中新建表时,extent分配情况按表空间所定参数进行,并以固定不变的uniform值进行extent扩充,而建表时指定上述各项storage参数无效(注意initial_extent)。 SQL> create tablespace tb1 datafile 'tb1.dbf' size 100M uniform size 1500k; 建表空间指定uniform分区大小 SQL> select substr(tablespace_name,1,8),initial_extent,next_extent,min_extents, max_extents,pct_increase from dba_tablespaces; SUBSTR(TABLESPAC INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE ---------------- -------------- ----------- ----------- ----------- ------------ TB1 1540096 1540096 1 2147483645 0 查表空间分配情况 SQL> select substr(table_name,1,8),initial_extent,next_extent,min_extents,max_ extents,pct_increase from dba_tables where table_name='T1'; SUBSTR(TABLE_NAM INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE ---------------- -------------- ----------- ----------- ----------- ------------ T1 253952 1540096 1 2147483645 0 查表分区参数,可见所有指定参数均失效(注意initial_extent) SQL> select extent_id,substr(segment_name,1,8),tablespace_name,bytes from dba_extents where segment_name='T1'; EXTENT_ID SUBSTR(SEGMENT_N TABLESPACE_NAME BYTES ---------- ---------------- ------------------------------ ---------- 0 T1 TB1 1540096 SQL> select extent_id,substr(segment_name,1,8),tablespace_name,bytes from dba_extents where segment_name='T1'; 查询指定表的实际分区情况,可见首个分区分配为uniform指定值 SQL> insert into t1 select * from dba_objects; SQL> select extent_id,substr(segment_name,1,8),tablespace_name,bytes from dba_extents where segment_name='T1'; EXTENT_ID SUBSTR(SEGMENT_N TABLESPACE_NAME BYTES ---------- ---------------- ------------------------------ ---------- 0 T1 TB1 1540096 1 T1 TB1 1540096 2 T1 TB1 1540096 3 T1 TB1 1540096 扩充表后再用上一条命令表达实际分区情况,可见扩充分区分配也均为uniform autoallocate管理方式下,表空间的extent分配原则是:initial,min,max自动取默认值(64k,1,2^31),next,pct参数无效;表空间中新建表时,extent分配情况按表空间所定参数进行,并以下规则进行extent扩充,而建表是指定上述各项storge参数无效。 ·next,pct参数无效,所有空间分配按64k 的整数倍大小进行分配; ·第1-15个分区,每个分区大小64k,合计1M; ·第16-79个分区,每个分区大小1M,合计63M,以上两项大小合计64M; ·第80-199个分区,每个分区大小8M,合计960M,以上三项合计1G; ·第200个分区以上,每个分区大小是64M; oracle10.2.0.2分区分配规则: ·第0-127个分区,每个分区大小8M,合计1G; ·第128个分区以上,每个64M。 SQL> create tablespace tb2 datafile 'tb2.dbf' size 100M; 建表空间默认使用autoallocate管理方式 SQL> select substr(tablespace_name,1,8),initial_extent,next_extent,min_extents, max_extents,pct_increase from dba_tablespaces; SUBSTR(TABLESPAC INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE ---------------- -------------- ----------- ----------- ----------- ------------ TB2 65536 1 2147483645 查表空间分区分配情况 SQL> create table t2 tablespace tb2 storage (initial 50k next 80k minextents 3 maxextents 9 pctincrease 40) as select * from dba_objects where 1=2; SQL> select substr(table_name,1,8),initial_extent,next_extent,min_extents, max_extents,pct_increase from dba_tables where table_name='T2'; SUBSTR(TABLE_NAM INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE ---------------- -------------- ----------- ----------- ----------- ------------ T2 253952 1 2147483645 查表分区参数,可见所有指定参数均失效(注意initial_extent) SQL> select extent_id,substr(segment_name,1,8),tablespace_name,bytes from dba_extents where segment_name='T2'; 查询指定表的实际分区情况,可见首个分区分配为64k SQL> insert into t2 select * from dba_objects; 扩充表后再用上一条命令表达实际分区情况,可见扩充分区分配满足上页规则。 Free list&free group 在segment中,若同一时刻发生多个insert,将引起free list争用,故一个segment中一般存在多个free list。free list的多少决定了同一时刻可以在同一segment中进行insert操作的数量。多个free list又可归属于不同的free list group。 SQL> create table t5(a int,b char(16)); SQL> select substr(segment_name,1,8),freelists,freelist_groups from dba_segments where segment_name='T5'; SUBSTR(SEGMENT_N FREELISTS FREELIST_GROUPS ---------------- ---------- --------------- T5 1 1 SQL> alter table t5 storage (freelists 5); SQL> select substr(segment_name,1,8),freelists,freelist_groups from dba_segments where segment_name='T5'; SUBSTR(SEGMENT_N FREELISTS FREELIST_GROUPS ---------------- ---------- --------------- T5 5 1 SQL> create table t6 (a int,b char(16)) storage (freelists 4 freelist groups 2); SQL> select substr(segment_name,1,8),freelists,freelist_groups from dba_segments where segment_name='T6'; SUBSTR(SEGMENT_N FREELISTS FREELIST_GROUPS ---------------- ---------- --------------- T6 4 2 当freelist group=1时,freelist都存储在segment header(第一个块)内,真正数据段存储就从第2块开始,当freelist group>1时,freelist从segment header内分离出来,存储在单独的块里面,每个freelistgroup占一个block,即真正数据段存储就从 1(for segment header)+n(free list group数量)块之后的块开始。 转载请保留固定链接: https://linuxeye.com/database/666.html |