oracle表空间管理

时间:2022-04-18 07:49:10
 oracle存储的最小粒度是data block,处于data block之上的逻辑数据库空间是extent,位于extent上的segment。

oracle表空间管理

oracle为segment分配空间时以extend为单位,extent在磁盘上未必是连续的。当用户分配一个新的extent时,其中的data block未必被同时分配。但如果用户为某个数据库对象分配扩展,那么data block 也同时被立即分配并加入free list中,如果extent并非为某数据库对象分配,那么data block 只在高水位线上(high water mark)移动时才分配。高水位线是segment中已用和未用空间的边界。


一、data block

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

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

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

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

oracle表空间管理

块首部(block header)包含块类型的有关信息(表块、索引块)、块上发生的活动事务和过去事务的相关信息,以及块在磁盘上的地址。
表目录(table directory),包含把行存储在这个块上的表的有关信息。
行目录(row directory)包含块中行的描述信息,这是一个指针数组,指向块数据部分中的行。
以上3部分称为块开销(block overhead),这部分空间并不用于存放数据,而是由oracle用来管理块本身。接下来的两部分就是存储数据了:块上可能有一个空闲空间(free space),通常还会有一个目前已经存放数据的已用空间(used space)。

对于块空间的管理,主要有两个参数,pctfree和pctused。

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

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

oracle表空间管理

二、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的分配方式。

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

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


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

* 表,簇表的所有者(owner)或拥有 DELETE ANY 权限的用户, 可以使用 TRUNCATE...DROP STORAGE 语句将表,簇表的数据清除
* DBA 可以使用以下语法收回一个段中未使用的extent:

ALTER TABLE table_name DEALLOCATE UNUSED;
* 如果用户为回滚段(rollback segment)设定了 OPTIMAL 参数,Oracle将周期性地从其中回收extent。



三 segment

段(segment)由一组extent构成,其中存储了表空间(tablespace)内各种逻辑存储结构的数据。例如,Oracle能为每个表的数据段(data segment)分配extent,还能为每个索引的索引段(index segment)分配extent。