现在的位置: 首页 > 数据库 > 正文

Oracle存储体系解读

2014年11月04日 数据库 ⁄ 共 1562字 暂无评论 ⁄ 阅读 860 次
文章目录

表空间(tablespace)

数据库由一个或多个表空间组成。表空间是Oracle中的逻辑存储容器,它包括一个或多个数据文件。这些文件可能是文件系统中的cooked分区、原始分区、ASM管理的数据库文件或集群文件系统上的文件。表空间在逻辑上由段组成。

段(segment)

段就是存储的数据对象。创建表时会创建一个表段,创建分区表时,则每个分区会创建一个段。每一个对象都会存储在一个段中,如索引段、CLOB段、回滚段、临时段及聚簇段等。

一条CREATE语句最后创建的对象可能包含0个、1个或多个段,如:

CREATE TABLE T (x int primary key,y clob)就会创建4个段:一个表T的表段、一个x的索引段(主键自动建索引),另外还有两个CLOB段(一个CLOB段是LOB索引,另一个段是LOB数据本身)。

CREATE TABLE T (x int,y date) cluster MY_CLUSTER则不会创建段,因为聚簇就是段。

区段(extent)

段本身由一个或多个区段组成,区段是文件中一个逻辑上连续分配的空间(文件本身在磁盘上并不是连续的)。

传统的每个段都至少有一个区段,有些对象可能还需要至少两个区段。如果一个对象超出了其初始区段,就会请求再为其分配另一个区段。第二个区段不一定在磁盘上第一个区段旁边,甚至有可能不在第一个区段所在的文件中。

一个段的区段可能不在一个文件甚至一个表空间中,而一个区段则必须仅在一个文件中,区段内的空间总是文件中的一个逻辑连续空间。

块(block)

区段由块组成,块是Oracle中最小的空间分配单位。数据行、索引条或临时排序结果就存储在块中。通常Oracle从磁盘读写的就是块,常见的块大小有2、4、8或16KB(32KB也允许但操作系统可能对最大大小有限制。另外,非2的幂如5KB也是允许的,不过可能出错且难解决)。

块是数据库中最小的分配单位,也是数据库使用的最小I/O单位。

块结构

首先,看一下块的结构图:

oracle-store2

数据库中大部分块都是这种结构,然而也有例外,如LOB段块和Exadata存储中的复合柱压缩块。

块首部(block header)包含块类型的有关信息(表块、索引块等)、块上发生的活动事务和过去事务的相关信息(仅事务管理的块有些信息,如临时排序块就没有事务信息),以及块在磁盘上的地址(物理位置)。简要来说,块首存储了块类型信息、事务信息及块地址。

表目录(table directory)包含存储在本块上的行所在表的有关信息(可能一个块上存储多个表的行数据)。

行目录(row directory)包含块中行的描述信息,这是一个指针数组,指向块中数据部分中的行。

以上3部分统称为块开销(block overhead),这部分空间并不用于存放数据,而是由Oracle用来管理块本身。

段、区段、块关系

可用下图来理解:

oracle-store1

一个表空间中的所有块大小都相同,但对于一个包含多个段的对象(如含有大字段LOB时),可能每个段在不同的表空间中,而这些表空间分别有不同的块大小。然而,对于任意一个段而言,它肯定有大小相同的块组成(因为一个段肯定位于一个表空间中)。单段不跨表空间,单区段不跨数据文件。

表空间、段、区段关系

关于表空间、段和区段的关系,我们可以通过下图的例子来理解:

oracle-store3

这个表空间包含2个数据文件、3个段和4个区段。

2个数据文件:user_data01.dbf和user_data02.dbf。

3个段:T1、T2和I1(如,可能是两个表和一个索引)。

这个表空间中分配了4个区段,每个区段表示为逻辑上连续分配的一组数据块。段T1包括两个区段,分别在不同的文件中,而T2和I1各自只有一个区段。

声明:该笔记转载自《Oracle Database编程艺术:深入数据库体系结构》,仅用于个人学习,若侵犯到您的版权敬请告知!

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?