Oracle中的逻辑地址和逻辑文件

Oracle中的逻辑地址和逻辑文件

Oracle中的逻辑结构

Tablespace Segment Extent Block

一个数据库是由多个表空间tablespace组成,一个表空间又由多个段segment组成,一个段又由多个区extent组成,一个区则由多个块block组成。 一个数据库中,UNDOSYSTEM表空间是必须存在的。

简述

对于我们在数据库里新建数据库database,在数据库中建立多个表空间tablespace,在每个表空间内建表。例如我们可以分配多个用户,在user1用户下建立table1table2,user2下建立table3table4user1user2就等于不同的表空间,table1table2是建立在表空间下的不同段segment,而每张表的每个数据就是块block,一列数据可看做一个区extent,区满了之后不断扩展就组成了表。

逻辑体系结构

Segment

如果一个表不进行分区,那么一个表就是在一个Segment中。如果一个表进行多个分区,那么每一个分区就在一个Segment。 每一张表(未分区)都会有一个逻辑单元Segment,他代表了一张未分区表所存储的所有的数据。一个Segment可能存在于多个数据文件中,因为物理的数据文件是组成逻辑表空间的基本物理存储单位。 Segment由一组extent构成,其中存储了表空间tablespace内各种逻辑存储结构的数据。例如,Oracle能为每个表的数据段data segment分配extent,还能为每个索引的索引段index segment分配extent

Extent

extent segment由一个或多个extent组成,extent是文件中一个逻辑上连续分配的空间(一般来讲,文件本身在磁盘上并不是连续的)。每个segment都至少有一个extent,有些对象可能还需要至少两个extent(回滚段就至少需要两个extent)。

如果一个对象超出了其初始extent,就会请求再为它分配另一个extent。第二个extent不一定就在磁盘上第一个extent旁边,但extent内的空间总是文件中的一个逻辑连续空间。

每个段segment的定义中都包含了extent的存储参数storage parameter。存储参数适用于各种类型的段。这个参数控制着Oracle如何为段分配可用空间。例如,用户可以在CREATE TABLE 语句中使用STORAGE子句设定存储参数,决定创建表时为其数据段data segment分配多少初始空间,或限定一个表最多可以包含多少extent。如果用户没有为表设定存储参数,那么表在创建时使用所在表空间tablespace的默认存储参数。

用户既可以使用数据字典管理的表空间dictionary managed tablespace,也可以使用本地管理的表空间locally managed tablespace。除了SYSTEM之外的所有永久表空间permanent tablespace默认使用本地管理方式。

在一个本地管理的表空间中,其中所分配的extent的容量既可以是用户设定的固定值,也可以是由系统自动决定的可变值。当用户创建表空间tablespace时可以使用UNIFORM用户指定或AUTOALLOCATE由系统管理子句设定extent的分配方式。s

  • 对于固定容量UNIFORMextent,用户可以为extent设定容量或使用默认大小1MB。用户须确保每个extent的容量至少能包含5个数据块database block。本地管理locally managed的临时表空间temporary tablespace在分配extent时只能使用此种方式。
  • 对于由系统管理AUTOALLOCATEextent,由Oracle决定新增extent的最佳容量,其最小容量为64KB。如果创建表空间时使用了“segment space management auto”子句,且数据块容量大于等于16 KBOracle扩展一个段时segment所创建的extent的最小容量为1MB。对于永久表空间permanent tablespace上述参数均为默认值。

在本地管理的表空间locally managed tablespace中,INITIALNEXTPCTINCREASE,和 MINEXTENTS 这四个存储参数可以作用于段segment,但不能作用于表空间。INITIALNEXTPCTINCREASE,和 MINEXTENTS 相结合可以用于计算段的初始容量。

一般来说,在用户将一个段segment对应的方案对象schema object移除使用DROP TABLEDROP CLUSTER语句之前,此段的extent不会被回收到表空间tablespace中,但是以下情况例外:

  • 表,簇表的所有者owner或拥有DELETE ANY权限的用户, 可以使用TRUNCATE...DROP STORAGE语句将表,簇表的数据清除
  • DBA可以使用以下语法收回一个段中未使用的extent
    ALTER TABLE table_name DEALLOCATE UNUSED;
  • 如果用户为回滚段rollback segment设定了OPTIMAL参数,Oracle将周期性地从其中回收extent

Data Block

blockoracle中最小的空间分配单位。数据行、索引或者临时排序结果就存储在块中。通常oracle从磁盘读写的就是块。常见大小有4种:2kb4kb8kb或者16kb,但这并不意味着块的大小是2的幂,而是可以任意2~32之间的数值。

数据库中是允许有多种块大小,目的是为了可以在更多的情况下使用可传输的表空间。而有多种块大小的表空间主要用于传输表空间,一般没有其他用途。

数据库还有一个默认的块大小。system表空间总是使用这个默认块大小。

在所给定的表空间内部,块大小都是一致的。对于一个多段对象,如一个包含LOB列的表,可能每个段在不同的表空间中,而这些表空间分别有不同的大小。可无论大小如何,每个块的格式是一致的。

  • 块首部block header包含块类型的有关信息(表块、索引块)、块上发生的活动事务和过去事务的相关信息,以及块在磁盘上的地址。
  • 表目录table directory,包含把行存储在这个块上的表的有关信息。
  • 行目录row directory包含块中行的描述信息,这是一个指针数组,指向块数据部分中的行。

以上3部分称为块开销block overhead,这部分空间并不用于存放数据,而是由oracle用来管理块本身。接下来的两部分就是存储数据了:块上可能有一个空闲空间free space,通常还会有一个目前已经存放数据的已用空间used space

对于块空间的管理,主要有两个参数,pctfreepctused

pctfree值是指达到该值后,数据将无法继续插入数据,同时将该块从free list上移走; pctused值是指如果因删除更新等操作使得实际值低于pctused值,则表示数据可以继续插入,同时将该块移入free list,表示该块是空闲的。

系统默认值是pctfree =10 ,pctused=40


参考文章: