LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 数据库 >

oracle数据库逻辑结构(5)

时间:2012-07-01 18:53来源:未知 编辑:admin 点击:
三 区(extent) 概述 又称范围,是一组表空间内连续分配的相临数据块 是数据库分配disk空间的最小逻辑单位,也是表中数据增长的基本单位 一个oracle对象


三 区(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

------分隔线----------------------------
标签:逻辑结构Oracle
栏目列表
推荐内容