Block(块)最基本的存储单元
Extent(范围)一次分配的连续的块
Segment(段)属于同一对象的范围组成一个段
Tablespace(表空间)数据文件的组织行为
查看表emp的存储结构
sys@TEST> select tablespace_name,segment_name,extent_id,blocks from dba_extents where segment_name='EMP';
TABLESPACE SEGMENT_NAME EXTENT_ID BLOCKS
---------- -------------------- ---------- ----------
USERNEW EMP 0 8
USERS 表空间中有一个emp 表,emp 表是一个段。Emp 表由一个0 号范围组成。该范围中有8个数据块。
这个字典完美的显示了数据库逻辑体系的四个层次。这四个层次都是逻辑的。
块是建筑数据库的基石。是数据库的最小i/o 单位。
块的结构如下:
控制块存储的参数,在建表的时候指明,也可以后来修改
每个块为8k,段头我们不能存放数据,空闲列表指向第一个可用的数据块,再连接到下一个可用数据块。
高水位以上是崭新的数据块,一次数据都没有存放。
当超过PCT_USED就会从ferrlist中踢出 会造成空间的浪费。如直插入了一条数据,但是这个块不能在插入数据了。
pctfree留下的空间供update 使用
行迁移: 当一个行上的更新操作(原来的数据存在且没有减少)导致当前的数据不能在容纳在当前块,我们需要进行行迁移。一个行迁移意味着整
行数据将会移动,仅仅保留的是一个转移地址。因此整行数据都被移动,原始的数据块上仅仅保留的是指向新块的一个地址信息。
产生:update
行链接: 当一行数据太大而不能在一个单数据块容纳时,行链接由此产生。举例来说,当你使用了4kb的Oracle 数据块大小,而你需要插入一行数据是8k,
Oracle则需要使用3个数据块分成片来存储。因此,引起行链接的情形通常是,表上行记录的大小超出了数据库Oracle块的大小。
产生:insert
表上使用了LONG 或 LONG RAW数据类型的时候容易产生行链接。其次表上多于255列时Oracle会将这些过宽的表分片而产生行链接
lob表必须有行链
insert 操作
1.获取freelist
2.找到可用的数据块
3.插入数据到pctfree为止
4.从freelist中挪走
5.找下一个可用块
表空区方式有两种:
本地管理local(默认)
create tablespace ..... size 2m extent management local
segment space management auto;
字典管理dictionary(手工管理)
create tablespace ..... size 2m extent management dictionary
segment space management manual;
system表空间默认为手工管理
local 本地extent 管理分为两种:
一次性分配连续的快
select segment_name , extent_id, file_id, blocks from dba_extents where segment_name='T1'
select blocks, empty_blocks,num_freelist_blocks from
user_tables where table_name='T1';
自动管理
连续分配16次 8个块以后,会认为表很大一次分配了128个块
手工管理
alter table t1 allcate extent; //打开手工分配
alter table t1 allocate extent(datafile '/u01/oradata/orcl/system01.dbf' size 3m);
alter table t1 deallocate unused; //收回没有用的空间
create tablespace uni datafile '/u01/oradata/orcl/system02.dbf' size 10m uniform size 1m; //指定固定的大小
段的管理方式又分为两种:
自动(auto)
手动(manual)
手工管理的时候才回有pct_userd和free_list
create table e3 tablespace system pctfree 20 pctused 30 storage(freelists 2) as select * from emp where 0=9;
查看
select table_name,pct_free,pct_used,freelists from user_tables;
TABLE_NAME PCT_FREE PCT_USED FREELISTS
------------------------------ ---------- ---------- ----------
DEPT 10
EMP 10
BONUS 10
SALGRADE 10
E3 20 30 2
T1 10
可以看出,自动管理空闲块是通过位图块来管理的,手动管理空闲块是通过freelists来管理的。
为什么只有表e3 的显示和其它表不一样,因为他们的表空间不同,e3 在system 表空间,手工
管理空闲的块,其它表为users 表空间,10.2 以后的版本默认的表空间都为自动管理空闲块。
自动管理空闲块是通过位图块来管理的,本质的不同,没有空闲列表
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30024909/viewspace-1344059/ ,如需转载,请注明出处,否则将追究法律责任。