数据块由3部分组成:块头部分、空闲区、数据区。随着数据量的增加,块头部分从上而下占据空闲区而数据区从下而上占据空闲区。当两部分接触时数据块就满了。
数据区:存储的是数据行,当插入数据时从下而上占据空闲区
块头部分:存储数据块的地址、表目录、行目录和事务槽,事务槽是在事务修改数据行时使用。头部从上而下占据空闲区
空闲区:位于数据块的中部,初始化时是连续的。但是随着删除修改操作使得空闲区碎片化。oracle服务器会根据需要合并空闲区。
一、oracle引入4个参数管理数据块
1、控制并行操作的参数:initrans、maxtrans
数据块中每一个数据行的头部有一个锁位,该锁位记录了该数据行在事务中所使用的事务槽号。而事务槽在数据块的头部中,有关事务的控制信息放在事务槽中
oracle服务器是通过每一行的锁位中的事务槽号在数据块头中找到对应的事务槽,并利用该槽中的信息来完成该行的事务控制。
事务槽是用来存储与当前改变数据块的事务有关的信息,每一个事务只能使用一个事务槽即使这个事务正在修改多行数据或者多行索引记录。
initrans:定义了创建数据块或者索引块时事务槽的初始值,用来保证最低水平的并行操作
maxtrans:定义了创建数据块或者索引块时事务槽的最大值。随着并行事务的增加,数据块头部中的事务槽个数也要增加。该值规定了事务槽个数的上限。
注:并行操作和数据块的空间利用率是矛盾的,如果initrans和maxtrans值过大,这样增加了事务的并行数系统的效率也提高了,但是数据块头部中的事务槽个数增加导致数据区容量的减小。如果没有必要不要改变他们的默认值。
2、控制数据空间使用的参数:
pctfree和pctused
二、oracle一共提供了两种管理数据块的方法:手动管理和自动的段空间管理
(一)手工数据块的管理
手工的数据块管理是oracle的默认空间管理方式,oracle通过修改一下参数来手工配置数据块以便更有效的管理和控制磁盘空间的使用情况
1、pctfree:定义在数据块中预留空间的百分比,这部分数据空间只是在数据块中的数据行进行修改操作而造成的空间增长时使用的
2、pctused;定义数据块中已经使用的空间的百分比,只有当数据块中使用的空间的百分比小于该值时oracle才将这一数据块放入空闲队列
3、freelists:用来在一个段中定义空闲队列的个数,空闲队列是一个数据块的列表这些数据块将被用作插入操作的候选数据块。
例;当设置pctfree=15,pctused=30时oracle服务器的空间分配操作如下:
1、在进行数据的插入操作时,oracle服务器要保留数据块空间总数的15%的空闲空间,为将来可能的修改操作造成的扩容使用
2、当空闲空间小于或等于15%时,oracle服务器将该数据块从空闲队列中去掉,该块不能再进行插入操作。
3、如果进行了删除或者修改操作造成数据行的缩小释放磁盘空间,虽然空闲空间大于15%但是所使用的空间大于30%,该块仍然不能进行插入操作。
4、只有当使用的空间小于pctused= 30%时,该块才被重新被放入空闲队列中,允许插入操作。
注:引入pctfree和pctused的目的是避免造成系统的颠簸,因此数据块要空到一定的程度才能被插入数据。如果仅使用一个参数pctfree那么当空闲空间大于15%假如 为16%时,那么又可以被重新的插入数据,一旦插入数据使得空闲空间小于15%,又再次被从空闲队列中移除,这样的情况可能经常的发生也就是所谓的系统 颠簸。oracle的默认参数pctfree,pctused,freelists在不是必须的情况下尽量不要修改,因为oracle的多数参数是相互关联的,一旦修改不善就会造成系统的效 率低下。
(二)自动的段空间管理
该方法不是使用空闲队列而是使用位图来追踪段中的空闲和使用的数据块。该方法是优点如下:
1、管理上的方便,pctfree和freelists都是自动管理的
2、较好的空间利用率
3、并行插入操作的性能有较大的改进
配置自动的段管理的方法只能在表空间一级生效,而且是本地管理的表空间才能开启自动的段管理,并且该配置应用于该表空间下的所有的段。
在创建表空间时使用segment space management auto子句就可以完成自动的段空间管理配置
自动管理的段可以使普通的表、索引、也可以是索引表还可以是大对象段。
注:获取段的磁盘管理信息的数据字典主要有:dba_tablespaces、dba_data_files、dba_extents、dba_segments、dba_free_space.
总结:oracle数据块:oracle最小的存储单元,oracle数据块是数据库系统
数据块的内容和参数