翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx

上传人:b****5 文档编号:17912223 上传时间:2022-12-12 格式:DOCX 页数:15 大小:223.03KB
下载 相关 举报
翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx_第1页
第1页 / 共15页
翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx_第2页
第2页 / 共15页
翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx_第3页
第3页 / 共15页
翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx_第4页
第4页 / 共15页
翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx

《翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx》由会员分享,可在线阅读,更多相关《翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

翻译Oracle10g《概念Concepts 》第二章数据块区间和段Word文档格式.docx

然而,每个数据区间只能包含同一个数据文件的数据。

在用户分配一个新的数据区间时,其中的数据块未必被同时分配。

如果给一个特定的实例分配一个数据区间,数据块被立即到可用块列表(freelist)。

然而如果数据区间不是分配给一个特定实例,那么数据块只在高水位线(highwatermark)移动时才被分配。

高水位线是段中已用和未用空间的边界。

提示:

Oracle建议用户使用可用空间自动管理功能。

详见“可用空间管理”。

2.2数据块概述

Oracle对数据库数据文件中的存储空间进行管理的单位是数据块。

数据块是数据库中最小的(逻辑)数据单位。

与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节。

每种操作系统都有一个被称为块容量(blocksize)的参数。

Oracle请求数据时,总是访问整数个Oracle数据块,而不是操作系统块。

数据库中标准的块容量是由初始化参数DB_BLOCK_SIZE指定的。

除此之外,用户还可以指定五个非标准的块容量。

数据块容量应该设为操作系统块容量的整数倍(同时小于数据块容量的最大限制),以便减少不必要的I/O操作。

Oracle数据块是Oracle可以使用和分配的最小存储单位。

另见:

●针对特定操作系统的Oracle文档中包含更多有关数据块容量的信息

●多种数据块容量(MultipleBlockSizes)

2.2.1数据块格式

在Oracle中,不论数据块中存储的是表、索引或簇表(clustereddata),其内部结构都是类似的。

图2-2说明了数据块的格式。

图2-2数据块格式

本图显示了数据块的各个组成部分,包括:

数据块头(包括标准内容和可变内容)、表目录区、行目录区、可用空间区、行数据区。

以下各节将分别讲解各个组成部分。

图中两个箭头表示一个数据块中的可用空间区的容量是可变的。

2.2.1.1数据块头(包括标准内容和可变内容)

数据块头包含了常用数据块的基本信息,例如块地址及此数据块所属的段的类型(例如,数据或索引)。

2.2.1.2表目录区

如果一个数据表在此数据块中储存了数据行,那么数据表的信息将被记录在数据块的表目录区中。

2.2.1.3行目录区

此区域包含数据块中存储的数据行的信息(每个数据行片断在行数据区中的地址)。

[一个数据块中可能保存一个完整的数据行,也可能只保存数据行的一部分,所以文中使用rowpiece]

当一个数据块的行目录区空间被使用后,即使数据行被删除,行目录区空间也不会被回收。

举例来说,当一个曾经包含50条记录的数据块被清空后,其块头的行目录区仍然占用100字节空间。

只有在数据块中插入新数据时,行目录区空间才会被重新利用。

2.2.1.4管理开销

数据块头、表目录区、行目录区被统称为管理开销(overhead)。

其中有些数据块开销容量是固定的;

而整体数据块开销容量是可变的。

数据块中固定及可变管理开销的容量平均在84到107字节之间。

2.2.1.5行数据

这部分包含了表或索引的实际数据。

一个数据行可以跨多个数据块。

“行链接(RowChaining)及行迁移(RowMigrating)”

2.2.1.6可用空间区

在插入新数据行,或更新数据行需要更多空间时(例如,原来某行最后一个字段为空(trailingnull),现在要更新为非空值),分配可用空间区中的空间。

如果一个数据块属于表或簇表的数据段,或属于索引的索引段,那么其可用空间区中还可能存储事务条目(transactionentry)。

如果一个数据块中的数据行正在由INSERT,UPDATE,DELETE及SELECT...FORUPDATE语句访问,此数据块中就需要保存事务条目。

事务条目所需的存储空间依据操作系统而定。

常见的操作系统中事务条目大约需要占用23字节(byte)。

2.2.2可用空间管理

可用空间可以被手动或自动管理。

[注意本节中的“可用空间”与“可用空间区”的区别]

数据库中,每个段的可用空间可以被自动管理。

段内的可用/已用空间以位图形式记录,这与可用块以列表方式的管理不同。

段空间自动管理具备以下优势:

●易于使用

●更高空间利用率,尤其针对每行数据容量差异大的对象

●能够更好地针对当前数据的情况实时调整

●更好的多实例行为方面的性能/空间利用率

用户可以在创建一个本地管理表空间时,选择自动段空间管理功能。

这样在此表空间内创建的段都将默认地设置为自动段空间管理。

Oracle数据库管理员指南

2.2.2.1数据块可用空间的有效性及优化

有两种SQL语句可以增加数据块中的可用空间:

DELETE语句和将现有数据值更新为占用容量更小值的UPDATE语句。

在以下两种条件下,上述两中操作释放的空间可以被后续的INSERT语句使用:

●如果INSERT语句与上述两种操作在同一事务中,且位于释放空间的语句之后,那么INSERT语句可以使用被释放的空间。

●如果INSERT语句与释放空间的语句在不同的事务中(比如两者是由不同的用户提交的),那么只有在释放空间的语句提交后,且插入数据必需使用此空间时,INSERT语句才会使用被释放的空间。

数据块被释放出的空间在可用空间区内不一定是连续的。

Oracle在满足以下条件时才会将释放的空间合并到一个数据块的可用空间区:

(1)INSERT或UPDATE语句需要一个足够大的可用空间容纳新数据的数据块,

(2)此数据块中的可用空间不连续,数据无法被写入到数据块中连续的空间里。

Oracle只在满足上述条件时才对数据块中的可用空间进行合并,这样做是为了避免过于频繁的空间合并工作影响数据库性能。

2.2.2.2行链接(RowChaining)及行迁移(RowMigrating)

有两种情况会导致表中某行数据过大,一个数据块无法容纳。

第一种情况,当一行数据首次被插入时,数据块就无法容纳。

在这种情况下Oracle将这行数据存储在段内的一个数据块链中。

在插入数据量大的行时常会发生行链接,例如一个包含数据类型为LONG或LONGRAW列的数据行。

此时行链接不可避免。

第二种情况,原本存储在一个数据块内的数据行,因为更新操作导致长度增长,而所在数据块的可用空间不能容纳增长后的数据行。

在这种情况下,Oracle将此行数据迁移到新的数据块中。

Oracle在被迁移出原数据行原来所在位置后,保存一个指向新数据块的指针。

被迁移数据行的rowid(伪列,用于定位数据库中一条记录的一个相对唯一地址值)保持不变。

当数据行发生链接或迁移时,对其访问将会造成I/O性能降低,因为Oracle为获取这些数据行的数据时,必须检索更多的数据块。

●“数据行格式与尺寸”关于数据行片段和行格式的信息

●“数据行的Rowids”关于rowid的信息

●“物理Rowids”关于rowid的信息

●“OracleDatabasePerformanceTuningGuide”了解如何减少行链接与行迁移,以便提高系统I/O性能

2.2.3PCTFREE,PCTUSED,及行链接

在手动管理的表空间中,可以使用PCTFREE和PCTUSED这两个存储管理参数来控制对某段进行插入和更新操作时,如何利用属于此段的数据块中的可用空间。

可以在创建或修改表或簇(表或簇拥有自己的数据段)时为其设定PCTFREE参数。

也可以在创建或修改索引时为其设定PCTFREE参数(索引存储在索引段)。

本节内容不适用LOB数据类型(BLOB,CLOB,NCLOB及BFILE)。

这些类型的数据存储时不使用PCTFREE参数及可用块列表。

详见“LOB数据类型概述”。

2.2.3.1PCTFREE参数

PCTFREE参数用来设置一个数据块中需要保留(reserve)多少可用空间(百分比值)的最小值,为数据块中已有数据更新时可能发生的数据量增长做准备。

例如,当用户用CREATETABLE语句创建表时指定了以下参数:

PCTFREE20

这个参数设定了此表对应的数据段中的每个数据块至少保留20%的可用空间,以备块中已有数据更新时使用。

只要数据块中行数据区与数据块头的容量之和不超过数据块总容量的80%,用户就可以向其中插入新数据,数据行被放入行数据区,相关信息被写入数据块头。

图2-3介绍了PCTFREE的作用。

图2-3PCTFREE

2.2.3.2PCTUSED参数

PCTUSED参数用于决定一个数据块是否可被用于插入新数据,它的依据是行数据与数据块头(overhead)的容量之和占数据块全部容量的最大百分比。

当一个数据块中的可用空间比例小于PCTFREE参数的规定时,Oracle认为此数据块无法被用于插入新数据,直到数据块中的占用容量比例满足PCTUSED参数的限定。

在占用容量比例大于PCTUSED参数的限定之前,Oracle只在更新数据块内已有数据时才会使用此数据块的可用空间。

PCTUSED40

在例子中,当此表的某数据块占用容量比例高于40%时,Oracle不会将此数据块用于插入新数据行,直到使用的空间块数量下降到39%或更少(假设此数据块的可用空间曾经几乎达到PCTFREE限定)。

图2-4介绍了PCTUSED的作用。

图2-4PCTUSED

2.2.3.3PCTFREE和PCTUSED如何协同发挥作用

PCTFREE和PCTUSED共同作用可以优化数据块的空间使用。

图2-5介绍两种参数的交互作用。

图2-5使用PCTFREE和PCTUSED参数管理数据块的可用空间

上图说明了PCTFREE和PCTUSED如何共同作用以管理数据块可用空间的使用。

在第一步中,数据块占用空间比例小于80%时才能插入新数据,因为PCTFREE参数限定必须保留20%的可用空间用于块内已有数据的更新。

在第二步中,对数据块中已有数据的更新操作可以使用数据块中的保留空间。

只有当数据块内的占用空间比例低于40%时才能向其中插入新数据。

在第三步中,当数据块内的占用空间比例低于40%时,此数据块再次可以被用于插入新数据。

在第四步中,数据块占用空间比例小于80%时才能插入新数据,因为PCTFREE参数限定必须保留20%的可用空间用于块内已有数据的更新。

此过程如此往复循环。

在新分配的数据块中,可用于插入数据的空间等于数据块总容量减去数据块头(blockoverhead)再减去预留可用空间(PCTFREE)。

而更新数据块内已有数据可使用数据块中的所有可用空间。

因此,更新操作能够使数据块内的可用空间低于的PCTFREE限制,因为这些空间是专为更新操作而预留的。

在每个数据段与索引段中,Oracle管理一个或多个可用块列表——其中列出了所有属于此段的数据区间,且可用空间比例大于PCTFREE限定的数据块。

这些块可以执行插入操作。

当用户提交INSERT语句后,Oracle从可用块列表中选择第一个有效的数据块使用。

如果此数据块的可用空间不够容纳INSERT语句提交的数据,且此块的占用容量已经超过PCTUSED的限定,Oracle就将其从可用块列表中移出。

一个段可以同时使用多个可用块列表,以减少对一个表进行并发插入时产生的竞争。

当用户提交DELETE或UPDATE语句后,Oracle处理语句并检查相关数据块中的占用空间比例是否小于PCTUSED的规定。

如果满足,那么这个数据块就被放入当前事务正在使用的可用块列表的头部,如果当前事务还需要写入数据,此块将被首先使用。

当事务提交后,此数据块中的可用空间还可被其他事务使用。

2.3数据区间概述

数据区间是由一组连续的数据块构成的数据库逻辑存储分配单位。

段是由一个或多个数据区间构成的。

当一个段中已有空间被完全使用,Oracle为这个段分配新的数据区间。

2.3.1数据区间何时被分配

当创建表时,Oracle为此表的数据段分配一个包含若干数据块的初始区间(initialextent)。

尽管数据表中没有数据,但是此初始区间中的数据块已经为插入新数据做好了准备。

如果一个段的初始区间中的数据块都已装满,且需要更多空间存储新数据,Oracle自动为这个段分配一个增量区间(incrementalextent)。

增量区间是为段先前分配的区间的后续区间,它的容量大于或等于之前的数据区间。

为了管理的需要,每个段的段头中包含一个记录此段所有数据区间的目录。

本章的内容适用于串行执行(serialoperation),即只有一个服务进程解析、执行SQL语句。

对于并行执行的SQL语句(即一个语句由多个服务进程执行),数据区间的分配情况有所不同。

2.3.2如何决定数据区间分配时的数量与容量

每个段的定义中都包含了数据区间的存储参数。

存储参数适用于各种类型的段。

这个参数控制着Oracle如何为段分配可用空间。

例如,可以在CREATETABLE语句中使用STORAGE设定存储参数,决定创建表时为其数据段分配多少初始空间,或限定一个表最多可以包含多少数据区间。

如果用户没有为表设定存储参数,那么使用所在表空间的默认存储参数。

用户既可以使用数据字典管理表空间(依赖数据字典表监控空间利用情况),也可以使用本地管理表空间(使用位图(bitmap)代替数据字典表空间)来标记可用与已用空间。

由于本地管理表空间性能较好且易于管理,当用户没有显式地设定数据区间管理参数时,除SYSTEM之外的所有永久表空间(permanenttablespace)默认使用本地管理方式。

在一个本地管理表空间中,其数据区间的容量既可以是用户设定的固定值,也可以是由系统自动决定的可变值。

当用户创建表空间时,可以使用UNIFORM(用户指定)或AUTOALLOCATE(系统管理)设定数据区间的分配方式。

●对于固定容量(UNIFORM)的数据区间,用户可以为数据区间设定容量或使用默认大小(1MB)。

用户须确保每个数据区间的容量至少能包含5个数据块(给定的数据库块容量)。

临时表空间在管理其数据区间时只能使用此种分配方式。

●对于系统管理(AUTOALLOCATE)的数据区间,由Oracle决定新增数据区间的最佳容量,其最小容量为64KB。

如果创建表空间时使用了“segmentspacemanagementauto”子句,且数据库块容量大于等于16KB,Oracle创建一个最小容量为1M的数据区间用于管理段容量。

永久表空间上述参数均为默认值。

在本地管理表空间中,INITIAL、NEXT、PCTINCREASE和MINEXTENTS这四个存储参数不能作用于表空间级。

然而它们可以作用于段级别。

INITIAL、NEXT、PCTINCREASE和MINEXTENTS相结合可以用于计算段的初始容量。

当段容量确定后,Oracle使用内部算法确定其中每个初始区间的容量。

●“表空间内的空间管理”

●“大文件表空间”

●Oracle数据库管理员指南

2.3.3数据区间如何被分配

Oracle根据表空间管理方式的不同(本地管理或数据字典管理),使用不同的算法分配数据区间。

对于本地管理的表空间,Oracle在为新的数据区间寻找可用空间时,首先在表空间选择一个候选数据文件,再为了查找连续的数据块搜索该数据文件的位图。

如果此数据块中没有足够的连续可用空间,Oracle将查询其他数据文件。

Oracle强烈建议用户使用本地管理表空间。

2.3.4数据区间如何被回收

Oracle数据库提供了SegmentAdvisor工具,它依据模式对象(schemaobject)存储空间中的碎片程度来判断此对象中是否包含可回收的空间。

●Oracle数据库管理员指南:

了解段空间回收

●Oracle数据库SQL参考:

了解相关SQL语法和语义

一般来说,在用户将一个段对应的模式对象移除(使用DROPTABLE或DROPCLUSTER语句)之前,此段的数据区间不会被回收到表空间中,但是以下情况例外:

●表或簇表的所有者(owner)或拥有DELETEANY权限的用户,可以使用TRUNCATE...DROPSTORAGE语句清除表或簇表的数据

●DBA可以使用以下语法收回一个段中未使用的数据区间:

ALTERTABLEtable_nameDEALLOCATEUNUSED;

●如果回滚段被设定了OPTIMAL参数,Oracle将周期性地从其中回收数据区间。

当数据区间被释放后,Oracle修改数据文件的位图(对于本地管理表空间)或更新数据字典(对于数据字典管理表空间),将回收的数据区间视为可用空间。

被释放的数据区间中的数据无法继续访问。

●Oracle数据库SQL参考

2.3.4.1非簇表中的数据区间

只要非簇表存在或直到用户清空表,那么其对应的数据段内任何数据块将持续分配给表。

只要数据块有足够的空间,Oracle会在这些数据块中插入新数据。

即使用户删除表的所有行,Oracle也不会回收此表的数据块供表空间内的其他模式对象使用。

当用户移除一个非簇表,Oracle将在需要空间时回收此表对应的数据区间。

Oracle将此表数据段、索引段中包含的数据区间全部收回,并提供给同一表空间下的其他模式对象使用。

对于数据字典管理的表空间,当一个段需要的数据区间比现有可用区间的大时,Oracle通过寻找、合并连续被回收的数据区间来形成更大的数据区间。

这个过程被称为区间合并(coalescing)。

本地管理的表空间没有必要进行区间合并,因为所有连续空间都可以被用于分配新数据区间,而无需关心所用空间是如何被回收的。

2.3.4.2簇表中的数据区间

簇表的数据存储在为整个簇分配的数据段中。

因此当移除簇中的一个表时,数据段还要为簇中的其他表保留,因此没有数据区间被回收。

用户可以通过清空整个簇来回收属于簇的数据区间(哈希簇除外)。

2.3.4.3物化视图及其日志的数据区间

Oracle回收属于物化视图及其日志的数据区间的方式与表或簇相同。

“物化视图概述”

2.3.4.4索引的数据区间

只要索引存在,那么对应索引段的所有数据区间都不会被回收。

当用户移除索引或相关的表、簇时,Oracle才将表空间其他用户的区间回收。

2.3.4.5临时段的数据区间

当Oracle执行完一个SQL语句,且在执行过程中使用临时段时,Oracle自动地移除临时段,并将属于此临时段的数据区间还给临时段所在的表空间。

当用户执行单一排序(singlesort)语句时,Oracle将在此用户的临时表空间中创建为这个排序服务的临时段,并在执行后将此临时段使用的数据区间回收。

然而多重排序(multiplesort),可能会使用临时表空间中专为排序而创建的排序段。

在每个实例中只会分配一个排序段,在排序操作使用后也不会被回收,而是继续供以后的多重排序使用。

同一会话或同一事务的多个SQL语句,有可能共同使用一个临时表的临时段存储临时数据。

在这种情况下,Oracle在会话或事务结束后才移除临时段,并将使用的区间返还给其所在表空间的段。

●“临时段简介”

●“临时表”

2.3.4.6回滚段的数据区间

Oracle周期性地检查数据库回滚段的容量是否超过其最优值。

如果回滚段超过了最优值(即回滚段中的数据区间过多),Oracle将自动地从回滚段回收一些数据区间。

2.4段概述

段由一组数据区间构成,其中存储了表空间内各种逻辑存储结构的数据。

例如,Oracle为每个表的数据段分配至少一个数据区间,还能为每个索引的索引段分配数据区间。

本节包含以下主题:

●数据段简介

●索引段简介

●临时段简介

●自动撤销管理简介

2.4.1数据段简介

在Oracle数据库中,一个数据段可以为以下模式对象(或模式对象的一部分)存储数据:

●非分区表或非簇表

●分区表的一个分区

●一个簇表

当用户使用CREATE语句创建表或簇表时,Oracle创建相应的数据段。

表或簇表的存储参数用来决定对应数据段的数据区间如何被分配。

用户可以使用CREATE或ALTER语句直接设定这些存储参数。

这些参数将会影响与模式对象相关的数据段的存储与访问效率。

Oracle为物化视图及物化视图日志创建数据段的方式与表或簇表相似。

●Oracle数据库高级复制:

了解关于物化视图及物化视图日志的信息

查询语法

2.4.2索引段简介

Oracle数据库中每个非分区索引使用一个索引段来存储其数据。

对于分区索引,每个分区使用一个索引段来存储其数据。

用户可以使用CREATEINDEX语句为索引或索引分区创建索引段。

在创建语句中,用户可以设定索引段数据区间的存储参数以及此索引段应存储在哪个表空间中。

(表的数据段和与其相关的索引段不一定要存储在同一表空间中)索引段的存储参数将会影响数据的存储与访问效率。

2.4.3临时段简介

当处理一个查询时,Oracle经常需要为SQL语句解析与执行中间结果时准备临时空间。

Oracle自动地分配这个磁盘空间,被称为临时段。

例如,Oracle在进行排序操作时需要临时段。

如果排序操作可以在内存中执行,或Oracle设法利用索引执行操作,就不必创建临时段。

2.4.3.1需要使用临时段的操作

以下语句的执行过程中可能会使用临时段:

●CREATEINDEX

●SELECT…ORDERBY

●SELECTDISTINCT...

●SELECT...GROUP

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1