oracle数据库:数据文件_笔记8
3.块
区段又进一步由块组成。块(block)是Oracle中最小的空间分配单位。数据行、索引条目或临时排序结果就存储在块中。通常Oracle从磁盘读写的就是块。Oracle中块的常见大小有4种:2KB、4KB、8KB、16KB。
一个段由一个或多个区段组成,区段则由连续分配的一些块组成。从Oracle Database 9i Release 1起,数据库中最多可以有关6种不同的块大小(block size)
注意:之所以引入这个特性,即一个数据库中允许有多种块大小,目的是为了可以在更多的情况下使用可传输的表空间。如果能传输表空间,DBA就能从一个数据库移动或复制格式的数据文件,把它放在另一个数据库中,例如,可以从一个联机事务处理(OLTP)数据库中把所有表和索引复制到一个数据仓库(DW)中。有多种块大小的表空间主要用于传输表空间,一般没有其他用途。
数据库还有一个默认的块大小,即执行CREATE DATABASE命令时初始化文件中指定的大小。SYSTEM表空间总是使用这个默认块大小。当且仅当创建数据库时指定了一个非标准块的大小时,才会有6种不同的块大小。因此,在实际中,数据库最多有五种不同的块大小:默认大小和另外4种非默认的块大小。
在所有给定的表空间内部,块大小都是一致的,这说明,一个表空间中的所有块大小都相同。对于一个多段对象,如一个包含LOB列的表,可能每个段在不同的表空间中,而这些表空间分别有不同的块大小,但是任何给定段(包含在表空间中)都由相同大小的块组成。
无论大小如何,所有块格式都一样。
首部
表目录
行目录
空闲空间
数据
尾部
这种格式也有例外,例如LOB段块和Exadata存储中的复合柱状压缩块。块首部(block header)包含块类型的有关信息(表块、索引块等)、块上发生的活动事务和过去事务的相关信息(仅事务管理的块有此信息,例如临时排序块就没有事务信息),以及块在磁盘上的地址(位置)。块中接下来两部分位于最常见的数据库块中(即堆组织表的数据块)。
如果有表目录(table directory),则其中会包含把行存储在这个块上的表的有关信息(可能一个块上存储了多个表的数据)。行目录(row directory)包含块中行的描述信息。这是一个指针数组,指向块中数据部分中的行。块中的这3部分统称为块开销(block overhead),这部分空间并不用于存放数据,而是由Oracle用来管理块本身。
4.表空间
表空间是一个容器,其中包含有段。每个段都只属于一个表空间。一个表空间中可能有多个段。一个给定段的所有区段都在与段关联的表空间中。段绝对不会跨越表空间边界。表空间本身可以有一个或多个相关的数据文件。表空间中给定段的一个区段完全包含在一个数据文件中。不过,段可以有来自多个不同数据文件的区段。
3.4.3字典管理和本地管理的表空间
在Oracle8.1.5之前,表空间中管理区段的分配只有一种方法:字典管理的表空间(dictionary-managed tablespace)。也就是说,表空间中的空间在数据字典表中管理,这与管理账户数据(利用DEBIT和CREDIT表)的方法是一样的。借方有已经分配给对象的所有区段。贷方是所有可用的自由区段。如果一个对象需要另一个区段,就会向系统“申请”。然后Oracle访问其数据字典表,运行一些查询,查找到空间(也许找不到),然后更新一个表中的一行(或者从表中将这一行删除),再向另一个表插入一行。
为了得到额外的空间而在后台代表你执行的SQL称为递归SQL(recursive SQL)。如果频繁地执行这种递归SQL,开销可能相当大。对数据字典的这种更新必须是串行的。它们不能同时进行,所以要尽量避免。
在Oracle的早期版本中,这种空间管理问题(递归SQL开销)在"临时表空间"中最常见。空间会频繁地分配和撤销。这些操作必须串行执行,这就大大削弱了并发性,而增加了等待时间。在引入这个特殊的表空间类型之前,临时数据与永久数据在同样的表空间中管理,处理方式也与永久数据一样。
而临时表空间则不同,不能在其中创建自己的永久对象。实际上根本的区别只有这一条;空间还是数据字典表中管理。不过,一旦在临时表空间中分配了一个区段,系统就会一直持有(不会把空间交回)。下一次有人出于某种目的在临时表空间中请求空间时,Oracle会在其内部的已分配区段列表中查找已经分配的区段。如果找到,就会直接重用,否则还是用老办法来分配一个区段。采用这种方式,一旦数据库启动,并运行一段时间,临时段看上去就好像满了,但实际上只是“已分配”。里面都是空闲区段,它们的管理完全不同。当有人需要临时空间时,Oracle会在内存中的数据结构里查找空间,而不是执行代价昂贵的递归SQL。
在Oracle8.1.5及以后版本中,Oracle在减少这种空间管理开销方面又前进了一步,它引入了一个本地管理表空间概念。对于本地管理表空间,会使用每个数据文件中存储的一个位图来管理区段。现在要得到一个区段,系统所做只是在位图中将某一位设置为1。要释放一些空间,系统再把这一位设置为0。与使用字典管理的表空间相比,这样分配和释放空间就相当快。本地管理的表空间还有另外一些很好的特点,如可以保证区段的大小统一。
如果数据库中的SYSTEM是本地管理的表空间,并不是说这样的数据库中不支持字典管理的表空间,而是说其中根本无法创建字典管理的表空间。
sys@ORCL>create tablespace dmt 2 datafile '/tmp/dmt.dbf' size 2m 3 extent management dictionary; create tablespace dmt * ERROR at line 1: ORA-12913: Cannot create dictionary managed tablespace sys@ORCL>!oerr ora 12913 12913, 00000, "Cannot create dictionary managed tablespace" // *Cause: Attemp to create dictionary managed tablespace in database // which has system tablespace as locally managed // *Action: Create a locally managed tablespace. sys@ORCL>
http://www.52ij.com/jishu/5152.htmloracle数据库:数据文件_笔记7
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5153.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
