数据块分析

来源:互联网 发布:传奇续章挂机软件 编辑:程序博客网 时间:2024/04/27 22:48

数据块原理深入剖析 数据块,本文简称为“块” ,是oracle 最小的存储单位,oracle 数据在“块”中。一个块占用一定的磁盘空间,特别注意的是,这里的“块” 是oracle 的数据块,不是操作系统的块oracle 每次请求数据的时候,都是以块为单位。也就是说,oracle每次请求的数据是块的整数倍。如果oracle请求的数据量不到以块。oracle也会读取到整个块。所以说, “ 块” 是oracle读写数据的最小但闻或者最基本的单位。快的标准大小由初始化参数 DB_BLOCK_SIZE 指定。具有标准大小的块成为标准块。块的大小和标准块的大小不同的块叫非标准块。 统一数据库中,oracle9i 及以上版本支持同一数据库中同时使用标准块和非标准块。oracle允许指定5种非标准块。操作系统每次执行IO 的时候,是以操作系统的块为单位;oracle 每次执行io 的时候,都是以oracle的块为单位。 oracle 数据块大小一般是操作系统块的整数倍。快中存放表的数据和索引的数据,无论存放那种类型的数据块的格式都是相同的,块由块头,表目录 行目录, 空余空间。 和行数据五部分组成。HEADERtabke durectoryrow directoryfree space row data块头: 存放块的基本信息,如: 块的物理地址,块所属的段的类型(是数据段还是索引段)  。表目录:存放表的信息,即: 如果一些表的数据被存放在这个块中,那么,这些表的相关信息将被存放在“表目录” 中。行目录: 如果块中有行数据存在,则,这些行的信息将被记录在行目录中。这些信息包括行的地址等。行数据: 真正存放表数据和索引数据的地方。这部分空间是已被数据行占用的空间空余空间: 空余空间是一个快中未使用的区域,这片区域用于新行的插入和存在的行的更新。头部信息区: 我们把块头,表目录 行目录 这三部分合成为头部信息区。 头部信息区不存放数据,它存放的整个块的信息。 头部信息区的大小是课表的,一边来说,头部信息区的大小给予84字节 到107 字节之间。数据块中自由空间的使用当往数据库中插入数据的时候,快中的自由空间减少,当对快中已经存在的行进行修改(使得记录的长度增加)放入的时候,快中的自由空间也会减少。delete 语句和update 语句会使块中的自由空间增加,当使用delete 语句删除快中的记录或者使用update语句将列的值更改成一个更小数值的时候,oracle会释放出一部分自由空间,释放出的自由空间并不是连续的,通常情况下,oracle不会对快中不连续的自由空间进行合并。因为合并数据块中不连续的空间影响数据库的性能,。只有当用户进行数据插入或者更新操作,却找不到连续的自由空间的时候,oracle 才会合并数据块中不连续的自由空间。对于快中的自由空间,oracle提供不连续的自由空间对于块中的自由空间,oracle 提供两种管理方式: 自动管理 手动管理行连接和行迁移行连接: 如果我们往数据数据库中插图一行数据,这行数据很大,易于一个数据块存不下一正行,oracle 就会把一行数据分做极端存在几个数据块中,这个过程叫行连接----如果一行数据是普通行,这行数据能够存放在一个数据快中,如果一行数据是连接行,这行数据存放在多个数据块中。行迁移: 数据库中存在一条记录,用户执行update更新这条记录,这个update操作是这条记录变长,这个时候,oracle 在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈,oracle 只能把正行数据迁移到一个新的数据块中。原来的数据块中保留一个指针。这个指针指向新的数据块。被移动的这条记录的rowid 保持不变无论是行连接还是行迁移,都会影响数据库的性能。oracle在读取这样的记录的时候,oracle 会扫描多个数据块,执行更多的io块中自由空间的自动管理。oracle使用位图 来管理和跟踪数据块,这种块的空间管理方式叫做 “自动管理”自动管理:1.易于使用,更好的利用空间可以对空间进行适时调整快中自由空间的手动管理用户可以通过PCTFREE PCTUSED来调整快中的空间使用,这种管理方式叫手动管理,相对于自动管理,手动管理方式比较麻烦。不容易掌握,容易造成快中空间的浪费

pctfree 参数一用于指定快中必须保留的最小空闲空间百分例。之所以要预留这样的空间,是因为update 需要这些空间,如果update 没有空余空间,oracle 就会分配一个新的块。这回产生行迁移PCTUSED 也是用于设置一个百分比,当快中以实用的空间的比例小于这个百分比的时候,这个快中才被表示为有效状态,只有有效的块猜呗插入数据。如果数据块中存在行连接 行迁移 将会影响数据库的性能,因此我们应该想办法消除行连接和行迁移。step 1: 创建数据字典chained_rows 数据字典 chained_rows用于接受  analyze  list chined rows 的数据,数据字典 chained rows 由脚本utlchain。sql对表分析analyze table student_infot list  chined rows ; 执行这个命令将会把分析的结果写入表 chained_rows 中step3 查处连接行或者迁移行select * from chained_rowswhere table_name = 'student_infor';owner_name table_name clust ... head_rowid timestamp

 

创建中间表 int_student_infor 用于临时存放连接行或迁移行,该表的结构必须和表student_infor的结构完全相同,执行完上面的命令。连接行或者迁移行已经被插入到中间表int_student_infor 中step 5 :从已经存在的表student_infor 中删除连接行和迁移行delete from student_inforwhere rowid in(select head_rowid from chained_rowswhere table_name = 'student_infor');step 6:把中间表中的数据插入已经存在的表student_inforinsert into student_inforselect * from int_student_infor;step7 连接行的消除如果chained_rows中存在连接行,只能通过提高数快的大小,这一行的数据能够容纳在一个数据块中,但是,如果列的类型是long 或者是宽度比较大的char varchar2 行连接将无法避免数据块大小的选择:通常数据块的大小都是8k 但是对于不同的应用 应该选择不同的块大小数据块大小的遵循如下原则。下面的情况可以选择小尺寸数据块行的宽度很小,并伴有大量的随即访问减少块竞争注: 选择小尺寸数据块会浪费大量的存储空间下面的情况可以选择大尺寸数据块。行的宽度很大,或者含有lob 字应用中存在大量的顺序读。节省io 一次可以写入更多的数据, 节省存储空间

原创粉丝点击