数据库页面结构——Oracle篇(一)

我从存储管理出发,介绍数据库中的各种存储管理方法。为了和Informix比较,先介绍Oracle的存储管理结构。由浅入深,先介绍数据库的页面管理结构,再介绍段管理结构和分区管理结构。

数据库中的数据都是存储在文件或者裸盘上,但一个文件或者裸盘都相当大,有的数据库所有的数据都保存在同一个文件中,有的保存在多个文件中。数据库为了管理方便,将一个大磁盘空间分割成了很多小块,并将这个块称为页面(page),一个页面的大小往往是操作系统块大小的整数倍。尽管Oracle的文档上写的是“2 KB. Data blocks are the smallest units of storage that Oracle Database can use or allocate.”,但如果在块是4kB的操作系统上,用2KB的页面就非常浪费,所以建议数据库的页面大小最好使用操作系统块大小整数倍。系统的块大小可以用下面命令查看:

$getconf PAGESIZE

Oracle数据库支持多种页面大小,最大支持32KB。Oracle数据库有一个初始化参数DB_BLOCK_SIZE用来指定默认的数据库页面大小,正常情况下页面大小是4KB或者8KB,但无论如何都应该设置成操作系统块大小的整数倍,文档说明如下:“If the size differs for data blocks and operating system blocks, then the data block size must be a multiple of the operating system block size.”,文档说在64位平台上,最大的页面大小可以到32KB,但32位上是否也能到32KB就不清楚了,目前64位这么普及的情况下,这个问题也就不重要了。

Oracle的页面结构如下图所示:

(图片来自Oracle官方文档:Database Administration)

Block header

页头部分主要包含了公共的页面头信息(其中有页面类型,磁盘上的位置,页面校验码等信息),还包含一部分事务信息(包括活动事务和历史事务信息)。

页面上的事务信息,主要用于保持事务更新页面过程中释放的空间,只有当这些事务提交以后,这些空间才会真正的还给页面,才会被其它事务使用。事务信息的管理过程是一个非常复杂的过程,如果以后有机会,单独做为一个主题进行介绍。

Table directory

我这里将此翻译为表目录,对于堆组织表来说,同一个页面上都保存相同表的数据,这里就只保存此表的元数据。对于聚集表来说,多个表的数据可以保存在同一个页面上,这里就保存这些表的元数据。

Row directory

这里称此为项目录,项目录上保存了每个项的地址,项目录的编号是ROWID的组成部分。在更新数据的时候,要保证项目录的编号一直不变。项目录从前往后增长,在需要的时候才会分配,当数据和项目录重叠的时候,表示页面空闲空间已经用完。需要对空间进行重新整理,才能释放出删除操作释放的空间。除了最后一个项目录,其它项目录只能重用,不能释放。

Row Data

行数据都是从末尾开始分配,依次往前,如果中间某些记录被删除,这些空间不能被立即重用。只能等到这个页面没有更多的Free Space以后,在整理页面的过程中,会顺便把删除项的空间移动到Free Space中。但中间如果碰到某个删除项对应的事务还没有提交,这个项对应空间不能被计算在Free Space中,否则就会导致问题,具体什么问题大家可以思考思考。

其它

在建表的时候需要指定,两个参数,这两个参数对于页面有非常大的影响,一个是PCTFREE,另一个是PCTUSED。

PCTFREE用来指定预留多少空间用于以后的更新,也就是当插入数据的时候,超过了PCTFREE指定的值,就会认为这个页面已满,只有更新操作才能使用这个参数预留的空间。

PCTUSED用来指定页面可以被重新插入的一个阈值,只有当空闲空间超过PCTUSED指定的值以后,这个页面才能继续插入新的数据。否则此页面上只能有更新和删除操作。

时间: 2024-09-22 11:28:02

数据库页面结构——Oracle篇(一)的相关文章

数据库页面结构——Oracle篇(二)

页面是数据库存储管理的基本单位,也是和磁盘交互的最小单位.页面在数据库中有承上启下的作用,页面支撑着数据库的各种管理功能,包括表管理.索引管理.集群管理以及缓冲区管理等.在页面上也保存着数据库中最重要的信息--用户数据,所以页面的管理非常重要,今天接着讨论Oracle页面管理更详细的内容,主要包括页公共头.事务层.表目录.项目录.数据区域以及尾巴. Page Common Header Oracle数据库的页公共头是所有的页面都有的一个结构,其大小为20个字节,内容主要包括: 1.页面的类型,占

数据库页面结构——Oracle篇(四)

上篇我在Oracle中创建了一个简单的数据表,并在数据表中插入了两条记录.通过查看ROWID找到了这些插入的数据所在的对象编号.文件编号.页面编号和项编号,再根据页面在文件上的页面编号算出了数据在文件上的偏移,然后根据文件编号在系统表上找到数据文件所在的路径,最后将这些数据所在的页面定位了出来.下面我对这些数据根据页面结构做了一个简单的划分,每个部分都在图上做了标记,先看看整体情况,后面再详细的介绍每一个部分. 由上图可以看到页面数据总共分成了五个部分,下面详细的介绍每一部分的数据的含义. Pa

数据库页面结构——Oracle篇(三)

前面已经介绍了Oracle页面结构,今天就带领大家看看,前面说的页面结构在Oracle 12C中是不是这样子的. 要了解Oracle页面结构,必须能够查看对应的物理磁盘上保存的内容,就需要知道修改所对应的物理页面的位置.数据库中有一个叫ROWID的家伙,就是为了给用户说明数据在物理磁盘上保存的位置,但Oracle的ROWID有点复杂,所以先介绍一下ROWID的结构: Oracle的ROWID由四部分组成,一共18个字符,整体是一个64进制的数字,每个字符都是Base-64的字符,显示给用户的字符

修改数据库表结构,和项目中用到表的页面。

问题描述 修改数据库表结构,和项目中用到表的页面. 求助前辈们: 公司要修改数据库表结构,把两个表整合成一个,现在数据库端已经修改好了, 把B表数据和列都加到A表中了,但是项目中用到B表的页面有200个左右, 有什么好办法快速的修改好吗?项目是asp.net,实体是用Codesmith生成的. 解决方案 可以借助一些工具辅助下,比如vim 解决方案二: 用Codesmith再生成一次代码,然后再执行下重构就是了.不过如果你的代码耦合在一起,还是要一些工作量的.

jQuery Mobile教程:最简单的页面结构

文章简介:不管你是对jQuery Mobile一无所知或者对它有很大的兴趣在研究过程中,还是已经开始用它做项目的开发者,欢迎加入这个jqm学习之旅. 不管你是对jQuery Mobile一无所知或者对它有很大的兴趣在研究过程中,还是已经开始用它做项目的开发者,欢迎加入这个jqm学习之旅 1.什么是jQuery Mobile? 按照官方的描述:针对智能手机和平板.做过触摸优化的web框架.截止到编写这个教程的时候,目前最新的版本是1.3.0. 2.jQuery Mobile推崇什么? 其实很多读者

如何查看什么时间有哪些数据库对象结构被修改过

对象|数据|数据库  如何查看什么时间有哪些数据库对象结构被修改过 阿木伯 著   系统环境:   1.操作系统:Windows 2000   2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版   3.安装路径:C:\ORACLE   说明:   SQL> col OBJECT_NAME format a20   SQL> SELECT OBJECT_NAME, --对象名   OBJECT_TYPE, --对象类型   TO_CHAR(CREATED, 'YYYY

SQLSERVER的数据页面结构

  SQLSERVER的数据页面结构 在论坛里经常有人问到SQLSERVER是怎麽存放基础表数据的,既然不想查MSDN,本人就在这里说一下吧 每一行数据在数据页面里是怎麽存放的? 结构组成:每个SQLSERVER的数据页面大致分成3个部分:页头,页尾偏移量,数据存储 这3个部分 假设现在有一个表,表的结构是: CREATE TABLE test( a INT, b INT ) 他在1:100这个页面上存储数据(1是数据库的数据文件ID 亦即是FILEID,100 是PAGEID 页面编号). 这

关系型数据库表结构设计规范-浅谈(转)

  数据库表结构设计规范-浅谈,为啥是浅谈呢,因为主要的观点还是来自原微信公共账号的一篇文章,稍微加了一些自己的看法.   谁来进行数据库的设计? 肯定是具体的开发工程师来进行,开发同学的话,第一业务熟悉度比较高,第二结合OO和ORM的思想,能有比较好的运用关系型数据库的特性.如果是DBA同学的话,虽然对于数据库本身了解比较多,但是对于业务了解较少,很难有比较客观的设计.但是业务上线或者运行期间,需要DBA同学能够重度的加入进来,针对一些性能点和不合理的点进行优化,同事也可以在上线前,针对SQL

针对复杂的多级栏目该如何设计数据库表结构?

问题描述 针对复杂的多级栏目该如何设计数据库表结构? 比如可能存在如下几种情况: 主栏目1-->子栏目2-->子栏目3-->内容列表-->内容 主栏目2-->子栏目2-->内容列表-->内容 主栏目3-->内容列表-->内容 如果说为了开发和后期维护的方便,以及后期新的内容添加或删除方便,栏目表应该如何设计比较符合规范? 比如栏目按照一定规则拼接放到一个字段里: 主栏目1|子栏目11|子栏目111 主栏目2|子栏目21|子栏目212|子栏目2121 或