专业的IT培训机构|腾科IT教育集团
复制成功
微信号:togogoi
添加微信好友, 详细了解课程
已复制成功,如果自动跳转微信失败,请前往微信添加好友
打开微信
图片

腾科新闻

数据库块的定义

发布时间: 2022-03-23

数据库块的定义,块是Oracle数据库中最小的一个数据组织单位。它的大小是由参数db_block_size确定。它的取值和os有关,一般是os物理块的整数倍,即512K的倍数。块大小在创建数据库之前确定,数据库创建或安装结束后不得修改。

对于系统表空间及其他默认表空间使用参数db_block_size确定块大小,而对于其他非默认表空间使用参数blocksize确定块大小。

1.块结构

块结构示意如图1所示。


图1 块结构示意图


图1中所示块的各个组成部分及含义如下:块头(Block Header):最上面的三个部分。包含着关于块类型(表块、索引块等)的信息、块上活动和过时事务信息、磁盘上块地址信息。

Transaction Layer:决定了该块可以并发操作的事务数,其大小由init trans存储参数确定。而Variable大小由max trans确定。如果设置了不恰当的init trans和max trans,可能会导致进行大批量并发操作出现严重的ITL等待,甚至引起ITL死锁。

表目录(Table Directory):包含着此块中存储各行的表的信息(多个表的数据可能保存在同一个块中,如cluster table)。

行目录(Row Directory):包含在块中发现的描述行的信息。以上部分(CacheLayer+Transaction Layer+Table Directory+Row Directory)为块的开销(Block Overhead),其余部分为可用存储空间。

2.存储参数

改变default storage设置值对表空间中已有的数据库对象没有影响,它只影响新数据库对象的存储参数,且仅当这些新数据库对象未直接指定自己的存储参数时。

这里所说的存储参数主要有以下几个:

PCTFREE(空闲率):用于指定向块中插入新行时应该保留的空闲空间的百分比,该保留空间用于修改已包含在该块中的行的情况下使用。

如PCTFREE=20,表示插入数据只能占到数据块80%的空间。它主要是用于更新操作,其取值范围为1~99,默认为10。假设该参数取0,则表示在插入时将完全填满数据块。

在插入新行时,并达到该数据块的PCTFREE时,则将该块置为脱离自由空间列表。即使从块中删除一些行,也不立即将该块置为自由空间列表。适用于MSSM和ASSM。

PCTUSED(使用率):空间使用率限定值,目的是控制向一个数据块再插入新的数据行。当通过删除或更新行而使数据库块的使用百分比低于PCTUSED限定值时,Oracle又允许向该块中插入新的数据行。PCTUSED主要用于插入限制,是为表的每个数据块保留的可用空间的最小百分比。取值为1~99,默认为40。当块达到PCTUSED限额时,块被移出空闲队列。仅适用于MSSM。

段中每个块的首部都有一个事务表。事务表中建立一些条目来描述那些事务将块上的哪些行锁定。事务表的初始化大小由initrans指定。事务表会动态扩展,较大到maxtrans。所分配的每个事务条目需要占用块首部中23~24字节的存储空间。

INITRANS(最小事务数量):指定一个数据块中分配的事务槽的初始值。取值范围1~255,默认为1。每一个更新块的事务都需要在块中有一个事务入口。INITRANS参数确定为事务处理项预分配多少数据块头部的空间。当预计有许多并发事务处理要涉及某个块时,可为相关的事务处理项预分配更多的空间,以避免动态分配该空间的开销。

INITTRANS对于表的存储区参数来说默认为2(即便把它设为1或者在数据字典中声明为1)。此外,在执行create table as select时,每个初始创建的表块的相关事务列表(interested transaction list,ITL)的实际槽数目是3,而不是由inittrans指定的2。适用于MSSM和ASSM。

MAXTRANS(较大事务数量):指定数据块的并发事务较大数。取值范围1~255,默认为255。MAXTRANS限制能够并发进入一个数据块的事务数量。如果同时有MAXTRANS个事务在使用一个块,则请求该块信息的下一个事务必须等到正在使用该块的某一事务提交或回退才能使用该块。

MAXTRANS参数限制并行使用某个数据块的事务处理的数量。当预计有许多事务处理将并行访问某个小表时,则当创建表时,应设置该表的事务处理项预分配更多的块空间,较高的MAXTRANS参数值允许许多事务处理并行访问。

注意:在10g中MAXTRANS会被忽略,不管参数设置为多少,所有段的MAXTRANS都是255。

3.行链接与行迁移

行链接与行迁移在块中是两个很重要的概念。这两种现象的成因不同,但都会导致SQL语句执行过程中访问块的数目的增加,因此我们应该尽量减少这两种情况的发生。

行链接(ROW CHAINING):行链接产生在第一次插入数据的时候,如果一个块不能存放一行记录的情况下。这种情况下,Oracle将使用链接一个或者多个在这个段中保留的块存储这一行记录,行链接比较容易发生在比较大的行上,例如行上有LONG、LONG RAW、LOB等数据类型的字段,这种时候行链接是不可避免会产生的。

行迁移(ROW MIGRATION):当一行记录初始插入的时候事可以存储在一个块中,由于更新操作导致行长增加了,而块的自由空间已经完全满了,这个时候就产生了行迁移。在这种情况下,Oracle将会迁移整行数据到一个新的块中(假设一个块中可以存储下整行数据),Oracle会保留被迁移行的原始指针指向新的存放行数据的块,这就意味着被迁移行的ROW ID是不会改变的。

可以通过ANALYZE命令收集表的信息,以判断是否存在严重问题。



一旦出现严重的行链接、行迁移问题,可以通过多种方式解决。针对这两种情况,解决的方法不同。对于行迁移的清除,一般来说分为两个步骤:

第一步,控制住行迁移的增长,使其不再增多;

第二步,清除以前存在的行迁移。行迁移产生的主要原因是表上的PCTFREE参数设置过小导致的,而要实现第一步控制住行迁移的增长,就必须设置好一个正确合适的PCTFREE参数,否则即使清除了当前的行迁移后马上又会产生很多新的行迁移。

当然,这个参数也不是越大越好的,如果PCTFREE设置的过大,会导致数据块的利用率低,造成空间的大量浪费,因此必须设置一个合理的PCTFREE参数。行链接很难消除,完全消除行连接,有必要用较大的数据块尺寸来重建数据库。常用方式,是使用EXP/IMP工具导入、导出来处理行迁移。



使用CTAS的方式来处理行链接。


上一篇: 千万级PV高性能高并发网站架构设计

下一篇: 等长子网划分

在线咨询 ×

您好,请问有什么可以帮您?我们将竭诚提供最优质服务!