2009年2月6日星期五

数据块、数据扩展和段

一、数据块data block
oracle以数据块(data block)的形式管理数据库的数据文件中的存储空间。数据块是数据库使用的最小数据单元。每个操作系统都有一个块大小(block size,根据每个操作系统而不同)。oracle请求数据时使用的是oracle数据块的整数倍,不是操作系统的块。
标准的块大小,是由初始化参数中的DB_BLOCK_SIZE来指定的。此外,我们可以最多指定5个非标准的块大小。
注:指定的块大小最好是操作系统的块大小的整数倍,以避免不必要的I/O操作。oracle数据块是oracle能使用、分配的最小存储单元。
数据块的结构(format):
1、header(common and variable):头部包含了块的大致信息,比如块地址和段类型(例如是数据段还是索引段)
2、table directory:数据块的这个部分包含了在这个块中拥有行(rows)的那个表的信息
3、row directory:数据块的这个部分包含了在这个块中实际存储的行的信息(包括在行数据区域row data area中每个行片row piece的地址)
注:在一个数据块的开销中分配了row directory以后,除非这个行被删除,否则这个空间是不会被回收(reclaim)的
4、overhead 开销:data block header、table directory和row directory综合起来被称为开销overhead。开销中的有些值是大小固定的。但是数据块的总开销是变量。平均来讲,数据块的开销为84-107字节
5、row data:数据块的这个部分包含了表或者索引数据。行可以跨越多个数据块
6、free space:空闲空间存储新插入的行,或者当某个行的进行更新时,可能需要的额外空间
二、数据扩展extent
数据扩展是数据库存储空间分配的逻辑单元,它是由一些列连续的数据块组成的。一个或多个数据扩展轮流组成一个段(segment)。当在一个段中已经存在的空间全部被使用后,oracle会将一个新的数据扩展分配给这个段。
三、段segment
一个段segment是一系列的数据扩展(extent),其中存储了表空间(tablespace)内各种逻辑存储结构的数据。例如,对每个表,oracle分配了一个或多个数据扩展来组成那个表的数据段;对每隔索引,oracle分配了一个或多个数据扩展来组成它的索引段。
1、数据段data sgement
在oracle数据库中的一个数据段包含了下面这些中的数据:
非分区表或非簇表
分区表的一部分
一个簇表
当用户使用CREATE语句创建表或者簇的时候,oracle会创建相应的数据段。表或簇的存储参数用来决定相应的数据段的数据扩展如何被分配。用户可以使用CREATE或ALTER语句直接设定这些存储参数。这些参数会影响与对象(object)相关的数据段的存储和访问(retrieval)效率。
2、索引段index segment
oracle数据库中每个非分区索引(nonpartitioned index)有一个索引段来容纳它所有的数据。对一个分区索引(partitional index)而言,每个分区有一个索引段来容纳它的数据。
我们可以使用CREATE INDEX语句,来为每个索引或每个分区的索引创建索引段。在这个语句中,我们可以设索引段的存储参数以及索引段应该存储在那个表空间。索引段的存储参数将会影响数据的存储和访问效率。
注:表的数据段与其相关的索引段不一定要存储在同一表空间中,可以将两者存储在不同的磁盘上,来提高效率。因为在两个磁盘上,因此可以同时进行两者的操作。
3、临时段temporary segement
当处理查询时,oracle经常需要为SQL语句的解析(parsing)和执行(execution)的中间结果(intermediate stage)准备临时空间。oracle会自动分配称为临时段的磁盘空间。例如:当进行排序操作的时候就需要使用临时段。当排序操作可以在内存中执行,或可以利用索引执行时,不必创建临时段。
以下语句的执行可能会使用临时段:
CREATE INDEX
SELECT ... ORDER BY
SELECT DISTINCT ... (DISTINCT 清楚的、明确的)
SELECT ... GROUP BY
SELECT ... UNION (UNION 结合)
SELECT ... INTERSECT (INTERSECT 交叉)
SELECT ... MINUS
有些不能使用索引的关联操作(unindexed join),或者需要在子查询间建立相互关系(correlated subquery),也有可能需要使用临时段。
oracle可以为临时表(temporary table)及其索引分配临时段,临时表中的数据只在会话(session)或事务(transaction)的运行期内存在。
4、自动撤销管理automatic undo management
oracle中保存了用于恢复对数据库操作的信息。例如事务中所有操作的记录。oracle可以利用撤销信息完成以下工作:
回滚(rollback)一个活动的事务
恢复(recover)一个已经结束的事务
提供读完整性(read consistency)
恢复语句的逻辑错误(当执行了一个逻辑错误的语句后,oracle可以进行撤销操作)
自动撤销管理是基于撤销表空间的。用户使用撤销表空间来管理撤销信息,这样就不用创建多个大小不一的回滚段。
自动撤销管理消除(eliminate)了管理回滚字段的复杂性(complexity),使用户只需专注于控制撤销信息的保存期限。oracle强烈建议用户使用撤销表空间,避免使用回滚段。系统能够自动调整撤销信息在撤销表空间内的保存时间,以供需要使用撤销信息的查询使用。如果正在使用的撤销表空间中有足够的空降,用户可以为为UNDO_RETENTION(retention 保留)参数设定一个最低阀值(low threshold value),这样系统中的撤销信息至少在此值指定的时期内被保留。
用户可以使用V$UNDOSTAT视图来监视撤销表空间的使用情况,并对其进行配置以提高效率。V$UNDOSTAT能够显示各种与撤销空间及相关事务有关的统计信息,例如当前实例(instance)中使用了多少撤销空间。

没有评论:

发表评论