Oracle Concept 的一些笔记 -- block的概念

block/extent/segment为oracle存储数据的内存单元

 

block

最小的内存单元,一般是几个os的block

 

extent

一般有几个连续的oracle block组成

 

segment

包含多个extent, 和每一个对象对于,如一张表对应一个data segment,一个index对应一个index segment,如果是partition的表,则每一个partition对应一个segment.

 

Oracle为segment分配空间是以extent为单位的,如果一个segment中的所有extent满了,则Oracle自动再分配多个extent到该segment中,由于extent分配的随机性,所以基本上segment中的extent都不是连续的。

 

一个segment的所有extent都是存在于同一个表空间中,一个segment中的extent可以来自于多个data file,但一个extent只能在一个data file中

 

 

Although you can allocate additional extents, the blocks themselves are allocated separately. If you allocate an extent to a specific instance, the blocks are immediately allocated to the free list. However, if the extent is not allocated to a specific instance, then the blocks themselves are allocated only when the high water mark moves. The high water mark is the boundary between used and unused space in a segment.(待解释)

 

 

 

 Block

 

标准的Oracle block的大小是由初始化参数DB_BLOCK_SIZE规定,同时Oracle还支持指定五种非标准的block大小

 

Block内存格式

 

header:存放block的信息,例如block的内存地址,以及segment类型,例如(data segement /index segment)

 

table directory: block中包含的记录所属表的信息

 

row directory: 实际记录的信息,如行记录各部分的地址。这部分oc的内存不会随着记录被删除而释放,只有在新记录重新插入时,才会重用。例如如果一个block有50条记录,则row directory会一直保持100bytes的大小(这里是不是应该200?)

 

overhead: 上面三部分合起来称为overhead.有些block的overhead是固定的,有些不是。但是一般说来,overhead的大小在84-107 bytes

 

row data: 表或者索引数据,一条记录可以存放在多个block中

 

free space: 当有新记录或者一些update操作(例如将null列改为非空),Oracle会使用free space.同时free space也可以存放事务入口(transaction entries),一般在insert/update/select..for update/delete操作需要存放事务入口,事务入口的大小根据OS不同而不同,一般情况下需要23bytes.

 

 

 

Oracle中Free space有两种管理方式,自动或手动。Free Space可以按照segment为单位进行自动管理,在创建表空间时,可以指定自动管理,则该表空间的所有segment都会执行自动管理。

 

 

Free space在数据库发生delete 或者update操作时会增加,insert语句只有在delete已经提交或者和delete在同一事务的情况下,才可以使用这些被释放的空间。新释放出来的空间不一定是连续的,所以为了增加性能,Oracle只会insert/update找不到连续的空间时,才会进行压缩转移等操作,使分散的空间连续起来

 

有两种情况,一条记录会存在两个以上的block。一种是记录太大,一个block放不下,这样会使用row chain的技术。另一种情况是一开始记录放在一个block中,后由于update,太大无法放在这个block,那么Oracle会做row migration,该记录的rowid不会变化,记录会被migrate到新的block,但是原block会保存指向新地址的指针。

 

PCTFREE,PCTUSED,ROW CHANIN

pctfree就是指在一个block内至少要保存多少百分比的free space,以便为block内的记录的update操作使用

pctused就是指一个block内至少有多少百分比的free space以上,insert操作才可以在该block中插入数据

 

每一个data/indext segment都会维护一个或者多个的free list,所有含有大于pctfree空闲空间的block都会被放入到free list中,如果在insert过程中发现free list中的block已经低于pctused,则会被移出free list,如果在进行delete/update操作,发现空闲区大于pctused,那么就会将该block移至该事务free list的最前段,事务提交后,移到总的free list供其他事务使用。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值