`

Oracle数据块的概念总结(原创)

阅读更多

 

Oracle数据内部的逻辑存储

Oracle存储数据的最小粒度(finest level of granularity)被称为数据块 (data block)(也叫做逻辑块 (logical block),Oracle块 (Oracle block)或页 (page))。一个数据块对应于磁盘上数个字节(byte)的物理数据库空间。

处于数据块之上的逻辑数据库空间是数据扩展 (extent)。数据扩展是为存储数据而分配的一组连续的数据块。

位于数据扩展之上的逻辑数据库存储结构是段 (segment)。段由一组数据扩展 (extent)构成,这些数据扩展位于同一表空间(tablespace)中,用于存储各种逻辑数据结构。例如每个表(table)的数据都存储在其自身的数据段 (data segment)中,每个索引(index)的数据都存储在其自身的索引段 (index segment)中。如果表或索引是分区存储(partitioned)的,则每个分区拥有自己的段。

Oracle为段(segment)分配空间时以数据扩展(extent)为单位。当段内已有的数据扩展没有可用空间时,Oracle为此段分配一个新的数据扩展。因为数据扩展是随需分配的,所以一个段内的数据扩展在磁盘上未必是连续的。

这三者直接的关系如下图

 

                                           
一个段(segment)以及属于她的所有数据扩展(extent)必须包含在同一表空间中。但在一个表空间内,属于同一个段的数据扩展可以分布在多个数据文件(datafile)上,即段可以跨文件存储。但是每个数据扩展只能包含于同一个数据文件中。

在用户分配一个新的数据扩展(extent)时,其中的数据块(data block)未必被同时分配。如果用户是为某个数据库对象分配数据扩展 ,那么数据块也同时被立即分配并加入可用块列表(free list)中。如果数据扩展并非专为某数据库对象分配,那么数据块只在高水位线 (high water mark)移动时才被分配。高水位线是段(segment)中已用和未用空间的边界。

数据块概述

Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block)。数据块是数据库中最小的(逻辑)数据单位。与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节(byte)。每种操作系统都有一个被称为块容量 (block size)的参数。Oracle每次获取数据时,总是访问整数个(Oracle)数据块,而不是按照操作系统块的容量访问数据。

数据库中标准的数据块(data block)容量是由初始化参数 DB_BLOCK_SIZE 指定的。除此之外,用户还可以指定五个非标准的数据块容量(nonstandard block size,在10g R2 32bit版本中可以指定2k,4k,16k,32k四个非标准数据块容量)。数据块容量应该设为操作系统块容量的整数倍(同时小于数据块容量的最大限 制),以便减少不必要的I/O操作。Oracle的数据块是Oracle可以使用和分配的最小存储单位。

数据块结构

在Oracle中,不论数据块中存储的是表(table)、索引(index)或簇表(clustered data),其内部结构都是类似的。下图说明了数据块的结构

                                                             
                                          

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

标准内容:数据块头中包含了此数据块的概要信息,例如块地址(block address)及此数据块所属的段(segment)的类型,例如,表或索引,该部分为。可变内容:ITL(Interested Transaction List)用来记录该块所有发生的事务,一个itl可以看作是一个记录,在一个时间,可以记录一个事务(包括提交或者未提交事务)。当然,如果这个事务已 经提交,那么这个itl的位置就可以被反复使用了,因为itl类似记录,所以,有的时候也叫itl槽位。 如果一个事务一直没有提交,那么,这个事务将一直占用一个itl槽位,itl里面记录了事务信息,回滚段的入口,事务类型等等。如果这个事务已经提交,那 么,itl槽位中还保存的有这个事务提交时候的SCN号。

表目录区

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

行目录区

此区域包含数据块中存储的数据行的信息(每个数据行片断(row piece) 在行数据区(row data area)中的地址)。 (一个数据块中可能保存一个完整的数据行,也可能只保存数据行的一部分 ,所以文中使用row piece)

当一个数据块(data block)的行目录区(row directory)空间被使用后,即使数据行被删除(delete),行目录区空间也不会被回收。举例来说,当一个曾经包含50条记录的数据块被清空 后,其块头(header)的行目录区仍然占用100字节(byte)的空间。只有在数据块中插入(insert)新数据时,行目录区空间才会被重新利用。

管理开销

数据块头(data block header),表目录区(table directory),行目录区(row directory)被统称为管理开销。其中 有些开销的容量是固定的;而有些开销的总容量是可变的(ITL)。数据块中固定及可变管理开销的容量平均在84到107字节(byte)之间。

行数据

数据块(data block)中行数据区(row data)包含了表或索引的实际数据。一个数据行可以跨多个数据块(是行链接和行迁移下文会讲到)

可用空间

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

如果一个数据块(data block)属于表或簇表的数据段(data segment),或属于索引的索引段(index segment),那么在其数据块头中还可能会存储事务条目 。如果一个数据块中的数据行正在由 INSERT, UPDATE, DELETE,及 SELECT...FOR UPDATE 语句访问,此数据块中就需要保存事务条目。

事务条目所需的存储空间依据操作系统而定。在常见的操作系统中事务条目大约需要占用23字节(byte)。

数据块中的可用空间管理

数据库中段的管理方式决定了数据块中可用空间的管理方式。段的可用空间可以被自动管理。段内的可用/已用空间以位图(bitmap)形式记录(自动管理模式下),这与手动管理采用free list以列表方式的管理不同。段空间自动管理(Automatic segment-space management)具备以下优势:

1、空间利用效率更高,尤其针对每行数据容量差异大的表(或其他对象)

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

3、易于使用

4、在RAC环境下能更好的提升性能和空间利用(个人认为是因为第一和第二点的优势在RAC环境下能更明显的体现出来的原因。)

用户可以在创建一个本地管理的表空间(locally managed tablespace)时选择自动段空间管理(automatic segment-space management)功能。这样在此表空间内创建的段都将默认地设置为自动段空间管理。

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

有两种SQL语句可以增加数据块中的可用空间:分别是 DELETE 语句,和将现有数据值更新为占用容量更小值的 UPDATE 语句。在以下两种条件下,上述两中操作释放的空间可以被后续的 INSERT 语句使用:

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

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

数据块(data block)中被释放出的空间未必与可用空间区(free space)相连续。Oracle在满足以下条件时才会将释放的空间合并到可用空间区:(1) INSERT UPDATE 语句选中了一个有足够可用空间容纳新数据的数据块,(2)但是此块中的可用空间不连续,数据无法被写入到数据块中连续的空间里。Oracle只在 满足上述条件时才对数据块中的可用空间进行合并,这样做是为了避免过于频繁的空间合并工作影响数据库性能。

数据块中行片段

Oracle 使用一个或多个行片断(row piece)来存储表的每一行数据的前255列。当一个数据块(data block)可以容纳一个完整的数据行时(且表的列数小于等于 256),那么此行就可以使用一个行片断来存储。当插入(insert)一个数据行,或更新(update)已有数据行时,数据行容量大于数据块容量,那么 Oracle 将使用多个行片断来存储此行。大多数情况下,每个数据行只存储于一个行片断中,且在同一数据块内。

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

第一种情况,行链接

当一行数据被插入时一个数据块就无法容纳 。在这种情况下Oracle将这行数据存储在段内的一个数据块链 (chain)中。在插入数据量大的行时常会发生行链接(row chaining),例如一个包含数据类型为 LONG LONG RAW 列的数据行。此时行链接不可避免。当 Oracle 必须使用多个行片断来存储同一数据行时(且每个行片断位于不同的数据块内),此行将在多个数据块间构成行链接 (Row Chaining)。

当一个表超过 255 列时,每行第255列之后的数据将作为一个新的行片断(row piece)存储在相同的数据块(data block)中,这被称为块内链接 (intra-block chaining)。由多个行片断组成的行进行块内链接时,使用各行片断的 rowid 进行链接。当一个行为块内链接时,用户可以从同一数据块中访问此行的全部数据。如果一个数据行位于同一数据块内,那么访问此行不会影响 I/O 性能,因为访问此行不会带来额外的 I/O 开销。

行迁移

原本存储在一个数据块(data block)内的数据行,因为更新操作导致长度增长,而所在数据块的可用空间也不能容纳增长后的数据行 。在这种情况下,Oracle将此行数据迁移到新的数据块中。Oracle在被迁移数据行原来所在位置保存一个指向新数据块的指针。被迁移数据行的 rowid 保持不变。

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

PCTUSED、PCTFREE

在手动管理的表空间(manually managed tablespaces)中,用户可以使用 PCTFREE PCTUSED 这两个存储管理参数来控制对某段(segment)进行插入和更新操作时,如何利用属于此段的数据块(data block)中的可用空间。用户也可以在创建或修改索引时为其设定 PCTFREE 参数(索引存储在索引段(index segment)中)。

PCTFREE

PCTFREE 参数用来设置一个数据块(data block)中至少需要保留 (reserve)多少可用空间(百分比值),为数据块中已有数据更新时可能发生的数据量增长做准备。例如,当用户用 CREATE TABLE 语句创建表时指定了以下参数: PCTFREE 20。

这个参数设定了此表对应的数据段(data segment)中的每个数据块(data block)至少保留20%的可用空间,以备块中已有数据更新时使用。只要数据块中行数据区与数据块头的容量之和不超过数据块总容量的80%,用户就可以向其中插入新数据,数据行被放入行数据区(row data area),相关信息被写入数据块头(overhead area)。下图说明了 PCTFREE 的作用。                                          

                                                     

 

PCTUSED

PCTUSED 参数用于决定一个数据块(data block)是否可被用于插入新数据,她的依据是数据区(row data)与数据块头(overhead)的容量之和占数据块全部容量的最大百分比。当一个数据块中的可用空间比例小于 PCTFREE 参数的规定时,Oracle就认为此数据块无法被用于插入新数据,直到数据块中的占用容量比例小于 PCTUSED 参数的限定。 在数据块中的可用空间PCTFREE重新大于且占用容量比例大于 PCTUSED 参数的限定之前,Oracle只在更新数据块内已有数据时才会使用此数据块的可用空间,插入操作不使用该数据块的可用空间 。例如,当用户用 CREATE TABLE 语句创建表时指定了以下参数:PCTUSED 40。

在例子中,当此表的某数据块占用容量比例高于40%时,Oracle不会将此数据块用于插入新数据行(假设此数据块的可用空间曾经低于 PCTFREE 的限定)。下图说明了 PCTUSED 的作用。

                                                         
 

 

在新分配的数据块中(data block),可用于插入(insert)数据的空间等于数据块总容量减去数据块头(block overhead)再减去预留可用空间( PCTFREE )。而更新(update)数据块内已有数据可使用数据块中的所有可用空间。因此,更新操作能够使数据块内的可用空间低于的 PCTFREE 限制,因为这些空间是专为更新操作而预留的。

在每个数据段(data segment)与索引段(index segment)中,选择段的手动方式时,ORACLE管理着一个或多个可用块列表(free list)--其中列出了所有属于此段的数据扩展(extent),且可用空间比例大于 PCTFREE 限定的数据块。这些块可以被插入(insert)操作使用。 当用户提交了 INSERT 语句后,Oracle从free list列表中选择第一个有效的数据块使用。如果此数据块的可用空间不够容纳 INSERT 语句提交的数据,且此块的占用容量已经超过 PCTUSED 的限定,Oracle就将其从可用块列表中移出。一个段可以同时使用多个可用块列表,以减少对一个表进行并发插入时产生的竞争。

当用户提交了 DELETE 或 UPDATE 语句后,Oracle处理语句并检查相关数据块中的占用空间比例是否小于 PCTUSED 的规定。如果满足,那么这个数据块就被放入当前事务正在使用的可用块列表(free list)的头部,如果当前事务还需要写入数据,此块将被首先使用。当事务提交后,此数据块中的可用空间还可被其他事务使用。

在段的手动管理模式下块的空间管理可参见下图

 

                          
 

参考至:Oracle Concepts  (10g R2)

原创文章,转载请注明出处、作者

如有错误,欢迎指正

邮箱:czmcj@163.com

3
1
分享到:
评论

相关推荐

    ORACLE DBA工作笔记 运维数据迁移与性能调优

    3. Oracle数据库的架构和存储结构,例如表空间、段、数据块等概念,对这些基础概念的深入理解对于数据迁移和性能优化至关重要。 4. Oracle的数据备份和恢复技术,因为数据迁移往往需要确保数据的安全性和完整性,...

    Oracle经典资料(原创)

    1. 数据库概念:Oracle数据库是一个存储结构化数据的系统,它使用SQL(结构化查询语言)进行数据操作。数据以表的形式存在,表间可以通过关系进行链接。 2. 数据模型:Oracle支持关系数据模型,其中实体、属性和...

    一种将oracle数据库内的数据导入到mongodb数据库的方法及系统.docx

    这种数据导入方法和系统对需要将现有Oracle数据库数据迁移到MongoDB的组织尤其有用,比如在大数据分析、互联网应用、物联网(IoT)项目等场景下,需要灵活的数据库架构和高性能的数据处理能力时。同时,对于那些希望...

    原创实战Oracle RAC rman恢复

    首先,理解Oracle RAC的基本概念至关重要。RAC通过共享存储和Cluster File System (CFS) 实现多实例间的数据库访问。当一个实例发生故障时,其他实例可以接管工作,确保服务不间断。而RMAN则在数据库保护中扮演着...

    Oracle_Database_备份与恢复【小六原创】.doc

    EXP和IMP是早期的Oracle数据导出导入工具,现在已经被Data Pump所取代。Data Pump提供了更快的数据传输速度和更灵活的选项,支持并行导出和导入,同时还能进行数据子集导出,以满足特定需求。 DBV(Database ...

    【原创】oracle树形结构查询,层次查询,hierarical retrival

    Oracle中的树形结构查询,也被称为层次查询或hierarchical retrieval,是一种获取树形结构数据的方法。这种方法可以将数据组织成树形结构,具有层次关系的报表。树形结构的数据集合存在于我们日常生活中的很多地方,...

    自己总结的server教程和Oracle笔记

    作者提供的“Oracle自学笔记”很可能是他个人在学习过程中对概念、语法、操作以及问题解决方法的记录,对于初学者或者正在学习Oracle的人来说,这样的笔记通常包含了丰富的实战经验和技巧。 【标签】:“数据库” ...

    【SQL Server与Oracle区别.(经典、原创)】

    - 数据库存储结构:Oracle使用表空间和数据文件的概念,而SQL Server使用数据库和文件组。Oracle支持物理和逻辑存储分离,SQL Server则较为紧密集成。 - 内存结构:Oracle的SGA(System Global Area)包含多个内存...

    oracle相关oracle相关oracle相关oracle相关oracle相关

    数据库建模包括概念数据模型、逻辑数据模型和物理数据模型,良好的建模能提高数据一致性,降低数据冗余,对数据库性能有直接影响。 "裸设备和Oracle问答20例--Oracle专区--IT胖子1.htm"可能涉及Oracle的高级特性...

    oracle入门ppt

    2. **Oracle架构**:详述Oracle数据库的内部结构,包括服务器进程、后台进程、内存结构(SGA和PGA)、数据文件、控制文件、重做日志文件、表空间和数据块等。 3. **SQL基础**:讲解SQL语言的基本语法,包括SELECT...

    ADO.NET 总结(原创)

    在这个总结中,我们将深入探讨ADO.NET在数据读取、数据添加、修改和删除以及GridView填充方面的用法,并对比SQL Server和Oracle数据库的实现方式。 1. 数据读取: ADO.NET 使用 SqlConnection 对象连接到 SQL ...

    Oracle Database Concepts 10.2 .pdf

    这表明Oracle公司非常重视其产品的原创性和独特性,同时也提醒用户必须遵守相应的许可协议条款。 ### 六、美国政府权利声明 对于美国政府及其授权机构的使用,文档中明确规定了其权利范围。这部分内容指出了当软件...

    oracle存储过程集锦

    Oracle存储过程是数据库管理系统中的一种重要工具,它允许程序员或数据库管理员在数据库中定义一系列复杂的SQL语句和PL/SQL块,以便于执行批量处理、数据操作和业务逻辑。这个"Oracle存储过程集锦"包含了丰富的学习...

    杨长老数据库大会分享

    总结以上内容,Oracle数据库的分区技术是数据库管理中的高级技巧,通过合理应用分区技术,数据库管理员可以有效地提升数据库性能、简化数据维护工作以及优化查询效率。从Oracle 8.0到最新版本,分区技术不断进化,...

    多数据库数据同步系统

    总结来说,“多数据库数据同步系统”是一个能够整合MySQL、Oracle、SQL Server和Sybase等多种数据库的解决方案,它解决了数据集成中的诸多挑战,如跨平台兼容性、数据转换、冲突处理和性能优化等。通过这样的系统,...

    原创:oracle:sql介绍及SQL基本查询 <四>

    Oracle SQL是数据库管理中最常用的语言之一,用于在Oracle数据库中执行数据操作、查询、更新和管理。本篇文章将深入探讨SQL的基本概念以及SQL基础查询,旨在帮助初学者理解和掌握SQL的核心功能。 首先,SQL...

    ocp 笔记 原创

    根据提供的内容,我们可以总结出以下详细的IT知识点,主要聚焦于Oracle数据库系统的关键组成部分和技术细节。 ### 一、Oracle概念 #### 1. Oracle 文件类型 - **数据库文件**:一个数据库至少包含一个数据文件,每...

    大华SQL助手(原创)源码

    【大华SQL助手(原创)源码】是一个专为数据库管理设计的工具,它提供了方便的SQL查询、编辑和管理功能。源码的开放性使得用户可以深入理解其工作原理,学习数据库操作的相关知识,同时也为开发者提供了二次开发的...

    最新数据库系统原理课程设计模版.doc

    1. **数据库基本概念**:数据库是一个组织和存储数据的系统,它提供了一种有效的方式来管理和检索数据。在课程设计中,学生需要理解数据库的特性,如数据独立性、数据共享、数据冗余的减少和数据安全性。 2. **数据...

Global site tag (gtag.js) - Google Analytics