`
Tiwen
  • 浏览: 86207 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Oracle数据块体系介绍

 
阅读更多

数据块概述

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

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

另见:

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

多种数据块容量(Multiple Block Sizes)

2.2.1 数据块结构

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

图2-2 数据块结构

本图显示了数据块的各个组成部分,包括:数据块头(包括标准内容和可变内容)(common and variable header),表目录区(table directory),行目录区(row directory),可用空间区(free space),行数据区(row data)。以下各节将分别讲解各个组成部分。图中两个箭头表示一个数据块中的可用空间区的容量是可变的。

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

数据块头(header)中包含了此数据块的概要信息,例如块地址(block address)及此数据块所属的段(segment)的类型(例如,表或索引)。

2.2.1.2 表目录区

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

2.2.1.3 行目录区

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

 

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

2.2.1.4 管理开销

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

2.2.1.5 行数据

数据块(data block)中行数据区(row data)包含了表或索引的实际数据。一个数据行可以跨多个数据块。这就出现了“行链接(Row Chaining)及行迁移(Row Migrating)

2.2.1.6 可用空间区

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

如果一个数据块(data block)属于表或簇表的数据段(data segment),或属于索引的索引段(index segment),那么在其可用空间区中还可能会存储事务条目(transaction entry)。如果一个数据块中的数据行(row)正在由 INSERT,UPDATE,DELETE,及 SELECT...FOR UPDATE 语句访问,此数据块中就需要保存事务条目。事务条目所需的存储空间依据操作系统而定。在常见的操作系统中事务条目大约需要有两种SQL语句可以增加数据块中的可用空间:分别是 DELETE 语句,和将现有数据值更新为占用容量更小值的 UPDATE 语句。在以下两种条件下,上述两中操作释放的空间可以被后续的 INSERT 语句使用:

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

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

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

占用232.2.2.2 行链接(Row Chaining)及行迁移(Row Migrating)

有两种情况会导致表中某行数据过大,一个数据块(data block)无法容纳。第一种情况,当一行数据被插入时一个数据块就无法容纳。在这种情况下Oracle将这行数据存储在段内的一个数据块链(chain)中。在插入数据量大的行时常会发生行链接(row chaining),例如一个包含数据类型为 LONG 或 LONG RAW 列的数据行。此时行链接不可避免。

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

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

另见:

1. “数据行结构与长度”了解关于数据行结构的信息

2. “数据行的 Rowid”了解关于 rowid 的信息

3. “物理 Rowid”了解关于 rowid 的信息

Oracle Database Performance Tuning Guide 了解如何减少行链接与行迁移,以便提高系统I/O性能字节(byte)。

2.2.3 PCTFREE,PCTUSED,及行链接(Row Chaining)

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

提示:

本节的内容并不适用于 LOB 数据类型(BLOB,CLOB,NCLOB,及 BFILE)。 这些类型的数据存储时不使用 PCTFREE 参数及可用块列表(free list)。

2.2.3.1 PCTFREE 参数

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

PCTFREE 20

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

PCTUSED 参数

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

PCTUSED 40

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

图 2-4

PCTFREE 和 PCTUSED 如何协同发挥作用

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

PCTFREE 和 PCTUSED 如何共同作用以管理数据块(data block)可用空间的使用。

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

在第二步中,对数据块中已有数据的更新操作可以使用数据块中的保留空间。只有当数据块内的占用空间比例低于40%时才能向其中插入新数据。

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

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

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

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

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

2.3 数据扩展概述

数据扩展(extent)是由一组连续的数据块(data block)构成的数据库逻辑存储分配单位。而段(segment)则是由一个或多个数据扩展构成。当一个段中已有空间已经用完,Oracle为这个段分配新的数据扩展。

2.3.1 数据扩展何时被分配

当用户创建数据表时,Oracle为此表的数据段(data segment)分配一个包含若干数据块(data block)的初始数据扩展(initial extent)。虽然此时数据表中还没有数据,但是在此初始数据扩展中的数据块已经为插入新数据做好了准备。

如果一个段(segment)的初始数据扩展(initial extent)中的数据块(data block)都已装满,且有新数据插入需要空间时,Oracle自动为这个段分配一个增量数据扩展(incremental extent)。增量数据扩展是一个段中继已有数据扩展之后分配的后续数据扩展,她的容量大于或等于之前的数据扩展。

为了管理的需要,每个段(segment)的段头(header block)中包含一个记录此段所有数据扩展(extent)的目录。

分享到:
评论

相关推荐

    Oracle数据库体系结构( 中文详细版)

    每个表空间由一个或多个数据文件组成,每个数据文件中包含一系列的数据块,这是Oracle数据存储的最小单位。 2. **重做日志文件**(Redo Log Files):重做日志文件记录了对数据库的所有事务修改,用于在系统崩溃或...

    Oracle 12c数据库体系结构图文详解手册

    Oracle 12c数据库体系结构图文详解手册是 Oracle 12c数据库管理系统的核心组件之一,该手册详细介绍了 Oracle 12c数据库的体系结构、实例、数据库、内存结构、后台进程、控制文件、重做日志文件、数据文件等概念。...

    Oracle体系结构介绍

    ### Oracle体系结构介绍 #### 物理文件构成 在Oracle数据库系统中,物理文件是数据库在磁盘上存储数据的基本单位。这些文件包括数据文件、在线重做日志文件、控制文件、归档日志文件等。 - **数据文件(Datafiles...

    Oracle数据库的体系结构.pdf

    数据文件的物理结构由操作系统块组成,而这些块在Oracle中被组织为数据块。 - 临时文件(Temporary Files):用于存储临时段,这些段是在执行排序操作时产生的,不需要永久存储。 逻辑结构方面,Oracle数据库包含...

    Oracle体系结构概述

    4. **数据块**:数据块是Oracle数据库的最小逻辑存储单位,它对应于物理磁盘上的一个或多个扇区。 5. **模式对象**:模式对象包括表、视图、索引、序列、同义词等,它们是用户在数据库中创建的逻辑实体。 最后,...

    OracleDB体系结构

    当处理查询时,Oracle服务器进程会在数据库缓冲区高速缓存中查找所需的所有数据块。如果未在数据库缓冲区高速缓存中找到数据块,则服务器进程会从磁盘读取数据块并将其放入缓存中。这种方式极大地提高了数据访问的...

    oracle 数据据库 老方块

    - 学习Oracle数据库通常从理解数据库体系结构开始,包括表空间、数据文件、控制文件、重做日志文件等概念。 2. **SQL技巧**: - "SQL技巧篇一"和"SQL技巧篇二"可能涵盖查询优化、子查询、连接操作、聚合函数、...

    数据仓库 数据挖掘 oracle 数据 仓库构架

    与传统的操作型数据库不同,OLAP系统设计用于处理大量历史数据,支持复杂的分析操作,如切片、切块、转轴等,以帮助用户从不同角度观察数据。 ### (三)数据挖掘(DM) 数据挖掘是商业智能领域中的高级技术,它...

    oracle数据库体系结构

    Oracle数据库的逻辑结构则包括表空间、段、数据区和数据块。表空间是数据库中数据的逻辑分区,每个数据库至少有一个表空间。段是表空间中的逻辑存储单元,用于存储特定类型的数据,如数据段存储表数据,索引段存储...

    oracle 体系结构详解

    数据库缓冲区用于暂存从数据文件中读取的数据块,以减少对磁盘的I/O操作,提高数据库访问效率。共享池则包括数据字典缓冲区和库缓冲区,用于存放经常访问的数据字典信息和SQL脚本等,以加快查询速度。重做日志缓冲区...

    Oracle体系结构简介

    综上所述,Oracle的体系结构是一个全面的框架,包含了从数据存储、访问控制到性能优化的各个层面,以满足企业级数据库管理的需求。理解这个架构对于数据库管理员和开发人员来说至关重要,因为它影响着数据库的性能、...

    Oracle12c 结构体系

    本知识点将详细介绍Oracle 12c的结构体系,内容将涉及其体系结构的各个组成部分、工作机制以及如何协同工作以保障数据库的高效运行。 首先,了解Oracle 12c的体系结构,需要从系统全局区(System Global Area,SGA...

    Oracle数据库体系架构图

    2. **数据库缓存区**(Database Buffer Cache):也称为数据缓冲区,是SGA的核心,用于存储最近访问过的数据块的副本,从而减少了对物理磁盘的I/O操作。 3. **大型池**(Large Pool):主要用于RMAN恢复、备份操作...

    Oracle数据库体系结构(详细版)

    首先,Oracle数据库的核心组件是数据块、区、段和表空间。数据块是最小的I/O单位,它们在物理磁盘上存储数据。每个数据块包含多个行,以及用于管理空间和记录更改的元数据。区是由连续数据块组成的逻辑单元,通常...

    oracle体系结构8.09

    它使用LRU(Least Recently Used)算法来确保缓冲区中的数据块是最近最常被访问的,以此减少不必要的I/O操作。 - **触发条件**: - 检查点(Checkpoint)发生时。 - 一个服务进程在设定时间内未能找到空闲块。 - ...

    Oracle体系结构图以及分析

    Oracle数据库的逻辑结构(表空间、段、区、块)与物理结构(数据文件)相互映射,使得数据的存储和检索更为高效。这种复杂的架构设计使得Oracle能够支持高并发的用户访问、提供强大的数据管理和安全性,并保证了高度...

    Oracle体系结构详解

    - 存储数据块的缓存区域,提高读取效率。 - **Redo Log Buffer**: - 用于暂存事务变化,LGWR定期将其写入重做日志文件。 - **Large Pool**: - 用于大型数据库操作,如并行查询、大对象等。 - **Java Pool**...

    oracle体系结构介绍

    Oracle数据库的基本存储单元是数据块(Data Block),这是数据库读取和写入数据的基本单位。数据块的大小由DB_BLOCK_SIZE参数定义,可以根据应用的需求进行配置,常见的设置有8KB、16KB或32KB。选择合适的数据块大小...

    oracle数据库管理体系结构.ppt

    * 数据缓冲区(Data Buffer Cache):用于存储数据库的数据块 * 日志缓冲区(Log Buffer Cache):用于存储数据库的日志记录 Oracle数据库的进程: * 用户进程(User Process):负责管理用户的数据库请求 * ...

Global site tag (gtag.js) - Google Analytics