2.2数据块概述

2.2.1 数据块结构
    数据块是从上到下,是由数据块头(common and variable header--标准内容和可变内容),表目录区(table directory),行目录区(row directory),可用空间区(free space),行数据区(row data)组成的。
2.2.1.1 数据块头中包含了此数据块的概要信息,例如块地址(block address)及此数据块所属的段(segment)的类型(如表或索引)。
2.2.1.2 如果一个数据表在此数据块中储存了数据行,那么数据表的信息将被记录在数据块的表目录中(table directory)中。
2.2.1.3 行目录区中包含数据块中存储的数据行的信息(每个数据行片段在行数据区中的地址)。【一个数据块中可能保存一个完整的数据行,也可能只保存数据行的一部分,所以文中使用row piece】。当一个数据块的行目录区空间被使用后,即使数据行被删除,行目录区空间也不会被回收。举例说,当一个曾经包含50条记录的数据块被清空后,其块头的行目录区仍然占用100字节的空间,只有在数据块中插入新数据时,行目录区空间才会被重新利用。
2.2.1.4 数据块头(data block header),表目录区(table directory),行目录区(row directory)被统称为数据开销。其中有些开销的容量是固定的,而有些开销的总容量是可变的。数据块中固定及可变管理开销的容量平均在84到107字节之间。
2.2.1.5 数据块中行数据区包含了表或索引的实际数据。一个数据行可以跨多个数据块。
2.2.1.6 在插入新数据行,或者更新数据行需要更多空间时(如,原来某行最后一个字段为空,现在要更新为非空值),将使用可用空间区。如果一个数据块属于表或簇表的数据段,或属于索引的索引段,那么在其可用的空间区还可能会存储事务条目(transaction entry),如果一个数据块中的数据行正在由insert,update,delete以及select...for update语句访问,此数据块中就需要保存事务条目。事务条目所需的存储空间依据操作系统而定,在常见的操作系统中事务条目大约需要占用23字节。
2.2.3 pctfree,pctused,及行链接(Row Chaining)。
    在手动管理的表空间(manually managed tablespace)中,用户可以使用pctfree和pctused这两个存储管理参数来控制对某段(segment)进行插入和更新操作时,如何利用属于此段的数据块中的可用空间。用户也可以在创建或修改索引时为其设定pctfree参数。注意:LOB数据类型存储不使用pctfree参数和可用块列表。
    pctfree参数用来设置一个数据块中至少需要保留多少可用空间(百分比值),为数据块中已有数据更新时可能发生的数据量增长做准备,例如:当用户用create table 语句创建表时执行了以下参数:pctfree 20 这个参数设定了此表对应的数据段中每个数据块至少保留20%的可用空间,以备块中数据更新时使用。只要数据块中行数据区与数据块头的容量之和不超过数据块总容量的80%,用户就可以向其中插入新数据,数据行被放入行数据区,相关信息被写入数据块头。
    pctused参数用于决定一个数据块是否可以被用于插入新的数据。依据是数据区与数据块头的容量之和占数据块全部容量的最大百分比。当一个数据块中的可用空间比例小于pctfree参数的规定时,oracle就认为此数据块无法被用于插入新数据,直到数据块中的占用容量比例小于pctused参数的限定。在占用容量比例大于pctused参数的限定之前,oracle只在更新数据块内已有数据时才会使用此数据块的可用空间。翻译的话比较枯燥,其实白话一点意思就是,当pctused限定后,只有当数据块的可用空间低于pctused的规定时,才能插入新的数据,否则,可用空间只能用于当update造成的数据空间的增大,即使可用空间大于pctfree的界限。
    pctfree和pctused的共同作用,可以优化数据块的空间使用,例如:数据块pctfree=20;pctused=40。这个说明了
    1) 数据块占用容量必须小于80%才能插入新的数据,因为pctfree参数限定必须保留20%的可用空间用于块内已有数据的更新。
    2) 对数据块中已有数据的更新操作可以使用数据块中的保留空间,只有当数据块内的占用空间比例低于40%时才能向其中插入新数据。
    3) 当数据块内的占用空间比例低于40%时,此数据块再次可以被插入新数据。
    4) 数据块占用容量小于80%才能插入新数据,因为pctfree参数限定必须保留20%的可用空间用于块内已有数据的更新。此过程如此往复循环。
    注意:在新分配的数据块中(data block),可用于insert的数据的空间等于数据块总容量减去数据块头(block overhead),再减去预留可用空间(pctfree)。而更新(update)数据块内已有数据可使用数据块中的所有可用空间。因此,更新操作能够是数据块内的可用空间低于pctfree的限制,因为这些空间是专门内更新操作而预留的。在每个数据段(data segment)与索引段(index segment)中,oracle管理着一个或多个可用块列表(free list),其中列出了所有属于此段的数据扩展,切可用空间比例大于pctfree限定的数据块,这些块可用于insert操作。
    当用户提交了insert语句后,oracle从可用块列表中选择第一个有效的数据块使用。如果此数据块的可用空间不够容纳insert语句提交的数据,且此块的占用容量已经超过pctused的限定,oracle就将其从可用块列表中移出。一个段可以同时使用多个可用块列表,以减少对一个表进行并发插入(concurrent insert)时产生的竞争。
    当用户提交了update或者delete语句后,oracle处理语句并检查相关数据块中的占用空间比例是否小于pctused的规定,如果满足,那么这个数据块就被放入当前事务(transaction)正在使用的可用快列表的头部,如果当前事务还需要写入数据,此块将被首先使用。当事务提交后,此数据块中的可用空间还可以被其他事务使用。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10356975/viewspace-680355/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10356975/viewspace-680355/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值