学习目标
- 描述数据库的逻辑结构
- 列出段类型及其用途
- 列出控制块空间使用的关键字
- 获取存储结构信息
段的类型
段是数据库中占用空间的对象。它们使用数据库数据文件中的空间。介绍不同类型的段。
表
表是在数据库中存储数据的最常用方法。表段用于存储既没有集群也没有分区的表的数据。表段中的数据没有特定的存储顺序,数据库管理员(DBA)对表中块中的行位置几乎没有控制。一个表段中的所有数据必须存储在一个表空间中。
表分区
当数据库中的表具有高并发使用时,可伸缩性和可用性是主要关注的问题。在这种情况下,表中的数据可能存储在几个分区中,每个分区驻留在不同的表空间中。Oracle服务器目前支持按键值范围、按散列算法和按值列表进行分区。
如果对表进行了分区,则每个分区都是一个段,并且可以指定存储参数以独立控制它们。使用这种类型的段需要在Oracle9i企业版中使用分区选项。
集群
与表一样,集群也是一种数据段。集群中的行是根据键列值存储的。集群可以包含一个或多个表。集群中的表属于同一段,具有相同的存储特征。可以使用索引或散列算法访问集群表中的行。
索引
一个特定索引的所有条目都存储在一个索引段中。如果一个表有三个索引,则使用三个索引段。此段的目的是根据指定的键查找表中行的位置。
-
索引组织表(Index-Organized Table):
- 数据直接存储在索引中,基于键值进行组织。
- 不需要额外的表查找,数据可以直接从索引树中检索。
-
索引分区(Index Partition):
- 索引可以被分区并分布在多个表空间中。
- 每个索引分区对应一个段,不能跨多个表空间。
- 主要用于减少争用,通过分散索引的输入/输出(I/O)来提高性能。
-
撤销段(Undo Segment):
- 用于存储事务在修改数据库之前的旧值。
- 允许用户撤销对数据或索引块所做的更改。
-
临时段(Temporary Segment):
- 当执行如
CREATE INDEX
、SELECT DISTINCT
和SELECT GROUP BY
等命令时,Oracle服务器尝试在内存中进行排序。 - 如果排序所需的空间超过内存可用空间,临时结果将写入磁盘,临时段用于存储这些中间结果。
- 当执行如
- LOB段
表中的一个或多个列可用于存储大型对象(lob),如文本文档、图像或视频。如果列很大,Oracle服务器将这些值存储在称为LOB段的单独段中。该表只包含一个定位器或指向相应LOB数据位置的指针。 - 嵌套表
表中的列可以由用户定义的表组成,就像订单中的项一样。在这种情况下,内部表(称为嵌套表)作为单独的段存储。 - 引导段
引导段(也称为缓存段)由sql语句创建。创建数据库时的BSQ脚本。当实例打开数据库时,此段用于初始化数据字典缓存。
引导段不能被查询或更新,也不需要数据库管理员进行任何维护。
存储条款优先级
-
- 如果更改了存储参数,则新选项仅应用于尚未分配的区段。
-
- 某些参数不能在表空间级别指定。这些参数只能在段级别指定。
-
- 如果为表空间指定了最小区段大小,则该大小适用于将来为表空间中的段分配的所有区段。
Oracle 数据库中的 Extent(区)分配和释放
Extent(区)
- 定义:Extent 是在表空间中为段(Segment)分配的一块连续的存储空间。每个 Extent 由多个数据块(Block)组成。
Extent 的分配(Allocation)
Extent 会在以下情况下被分配:
-
创建(Created):当创建一个新的段(例如表或索引)时,Oracle 会为该段分配一个或多个 Extent。
-
扩展(Extended):当段的空间不足以存储新的数据时,Oracle 会自动为该段分配更多的 Extent,以满足存储需求。
-
修改(Altered):在某些情况下,修改段的结构(如增加列)可能会导致需要额外的 Extent。
Extent 的释放(Deallocation)
Extent 会在以下情况下被释放:
-
删除(Dropped):当段被删除时,所有与该段相关的 Extent 会被释放。
-
修改(Altered):某些修改操作可能会导致 Extent 的释放,尤其是当段的结构被显著改变时。
-
截断(Truncated):当段被截断时,所有数据会被删除,相关的 Extent 可能会被释放。
使用块和空闲块
在 Oracle 数据库中,表空间(Tablespace)是用于组织和存储数据库对象的逻辑存储单元。以下是表空间中已使用和空闲 Extent 的介绍:
数据文件头部(Header)
- 定义:当创建表空间时,数据文件中的第一个数据块或多个数据块被用作表空间的头部,用于存储关于表空间的元数据信息。
已使用 Extent 和空闲 Extent
-
已使用 Extent:
- 定义:当创建段(Segment)时,段会从表空间中的空闲 Extent 中分配空间,这些被段占用的连续空间被称为已使用 Extent。
- 特点:已使用 Extent 是被段实际占用的存储空间,用于存储段的数据。
-
空闲 Extent:
- 定义:当段释放空间时,释放的 Extent 会成为表空间中的空闲 Extent,可供其他段使用。
- 特点:空闲 Extent 是未被任何段占用的存储空间,可以被新创建的段或需要扩展的段使用。
操作过程
-
段创建:当创建新的表或索引等段时,Oracle 会从表空间的空闲 Extent 中分配连续的空间给该段。
-
段释放:当段被删除、截断或修改导致空间释放时,释放的 Extent 会成为表空间的空闲 Extent,可以被其他段使用。
优化和管理
-
空间管理:定期进行空间管理和维护,确保表空间中有足够的空闲 Extent,避免空间不足导致性能问题。
-
性能优化:合理分配和释放 Extent,避免空间碎片化,提高数据库性能和存储效率。
数据库块(Database Block)
数据库块的重要性
-
最小单位的 I/O:
- 数据库块是 Oracle 数据库中最小的 I/O 单元,所有的数据读取和写入操作都以数据库块为基本单位进行。
-
操作系统块的组合:
- 数据库块通常由一个或多个操作系统块组成,这取决于操作系统和数据库配置。多个操作系统块组合成一个数据库块有助于提高数据的读取和写入效率。
-
表空间创建时设置:
- 数据库块的大小是在创建表空间时设置的,不同的表空间可以有不同大小的数据库块。通过设置不同大小的数据库块,可以根据不同的需求来优化数据库的性能和存储管理。
-
DB_BLOCK_SIZE 是默认块大小:
DB_BLOCK_SIZE
是 Oracle 数据库中用于设置数据库块大小的参数,默认情况下,它定义了数据库的默认块大小。在创建表空间时,如果未指定数据库块的大小,则会使用默认的DB_BLOCK_SIZE
。
数据库块的应用
-
数据库块的大小直接影响数据库的性能和存储效率。较小的数据库块可以提高空间利用率,但可能增加 I/O 操作的开销;而较大的数据库块可以减少 I/O 操作次数,但可能造成空间浪费。
-
通过合理设置数据库块的大小,可以根据数据库的需求来平衡性能和存储效率。
举例说明
-
当数据库需要读取或写入数据时,数据会以数据库块为单位从磁盘读取到内存中进行处理,然后再写回磁盘。
-
如果数据库块大小为 8KB,而操作系统块大小为 4KB,那么一个数据库块可能由两个操作系统块组成。
# 查看数据库块大小
[oracle@localhost /oracle/app/dbs]$ cd /oracle/app/dbs
[oracle@localhost /oracle/app/dbs]$ ls
hc_DBUA0.dat init.ora lkGUOORACLE orapworacleSID
hc_guooracle.dat initoracleSID.ora lkORCL spfileguooracle.ora
hc_oracleSID.dat lkGUOORACL orapwguooracle spfileoracleSID.ora
[oracle@localhost /oracle/app/dbs]$ strings spfileoracleSID.ora | grep -i db_block
*.db_block_size=8192
多种块大小支持
可以使用标准块大小和最多四个非标准块大小创建数据库。块大小可以是2 KB到32 KB之间的任意2次幂值。
DB_CACHE_SIZE
在 Oracle 数据库中,标准块大小是在数据库创建时使用 DB_BLOCK_SIZE
参数设置的,一旦设置后,除非重新创建数据库,否则无法更改。标准块大小通常用于 SYSTEM 和 TEMPORARY 表空间。此外,DB_CACHE_SIZE
参数用于指定标准块大小的默认缓冲区缓存大小,具体特点如下:
-
设置方式:在数据库创建时使用
DB_BLOCK_SIZE
参数设置,决定了数据库中标准块的大小。 -
不可更改性:一旦设置了标准块大小,通常情况下无法在不重新创建数据库的情况下更改。
-
应用范围:标准块大小通常用于 SYSTEM 和 TEMPORARY 表空间,用于存储系统数据和临时数据。
-
DB_CACHE_SIZE 参数:
DB_CACHE_SIZE
参数用于指定标准块大小的默认缓冲区缓存大小。 -
最小大小:缓冲区缓存的最小大小为一个 granule(通常为 4 MB 或 16 MB)。
-
默认值:默认情况下,
DB_CACHE_SIZE
的默认值为 48 MB。
DB_BLOCK_SIZE
和 DB_CACHE_SIZE
初始化参数的详细介绍:
DB_BLOCK_SIZE 参数
-
定义:
DB_BLOCK_SIZE
初始化参数指定数据库的标准块大小。该块大小用于 SYSTEM 表空间和任何临时表空间。 -
默认值:除非另有指定,标准块大小也用作表空间的默认块大小。Oracle 支持最多四个额外的非标准块大小。
-
选择标准块大小:通常应选择最常用的块大小作为标准块大小。在许多情况下,这可能是您需要指定的唯一块大小。典型的
DB_BLOCK_SIZE
设置为 4 KB 或 8 KB。如果未指定,默认数据块大小取决于操作系统,通常是足够的。 -
不可更改性:数据库创建后,块大小无法更改,除非重新创建数据库。
DB_CACHE_SIZE 参数
-
定义:
DB_CACHE_SIZE
初始化参数替代了以前版本中使用的DB_BLOCK_BUFFERS
参数。DB_CACHE_SIZE
参数指定标准块大小缓冲区的缓存大小,标准块大小由DB_BLOCK_SIZE
指定。 -
向后兼容性:为了向后兼容,
DB_BLOCK_BUFFERS
参数仍然有效,但它是一个静态参数,不能与任何动态调整参数结合使用。
Granule 是连续虚拟内存分配的单位。Granule 的大小取决于估计的总 SGA 大小,其计算基于
SGA_MAX_SIZE
参数的值:
- 如果估计的 SGA 大小 < 128 MB,则 granule 大小为 4 MB。
- 否则,granule 大小为 16 MB。
Oracle 数据库中的缓存管理
在使用非标准块大小时,如何配置和管理数据库缓冲区缓存(Database Buffer Cache)以及相关的初始化参数。
1. 数据库缓冲区缓存(Database Buffer Cache)
数据库缓冲区缓存(SGA 的一部分)用于存储数据库的数据块。数据块是数据库的基本单位,当执行查询时,Oracle 会首先尝试从缓存中读取数据,而不是从磁盘中读取。这样可以显著提高查询性能。
2. 非标准块大小(Nonstandard Block Size)
通常,Oracle 数据库的默认数据块大小是 8 KB,但在一些情况下,可能需要使用不同的块大小(例如 2 KB、4 KB、16 KB 等)。当使用非标准块大小时,必须配置相应的缓冲区缓存,以确保数据库在运行时能够处理不同大小的数据块。
3. DB_CACHE_SIZE 和 DB_nK_CACHE_SIZE 参数
- DB_CACHE_SIZE:此参数决定了标准块大小的缓存大小。标准块大小通常是数据库实例的默认块大小(例如 8 KB)。如果不使用非标准块大小,可以仅配置此参数。
- DB_nK_CACHE_SIZE:此参数用于指定用于特定块大小的缓存。例如,
DB_2K_CACHE_SIZE
用于指定 2 KB 块大小的缓存大小,DB_8K_CACHE_SIZE
用于 8 KB 块大小的缓存大小。对于每个非标准块大小,都需要设置一个对应的DB_nK_CACHE_SIZE
参数。
配置要求
- 如果你打算使用多个块大小(例如 2 KB、4 KB、8 KB 等),你需要同时配置
DB_CACHE_SIZE
和至少一个DB_nK_CACHE_SIZE
参数。 - DB_nK_CACHE_SIZE 默认值为 0,但如果你有在线表空间使用某个特定的块大小(如 2 KB、4 KB 等),则不能将
DB_nK_CACHE_SIZE
设置为 0。
4. 平台特定的块大小限制
不同的平台有不同的块大小限制。例如:
- 如果平台的最大块大小小于 32 KB,那么就不能设置
DB_32K_CACHE_SIZE
。 - 如果平台的最小块大小大于 2 KB,那么就不能设置
DB_2K_CACHE_SIZE
。
因此,在配置这些参数时,必须考虑操作系统和硬件平台对块大小的限制。
5. 标准块大小的缓存
请注意,DB_nK_CACHE_SIZE
参数只能用于非标准块大小的缓存(例如 2 KB、4 KB、16 KB 等)。标准块大小的缓存始终由 DB_CACHE_SIZE
来控制,因此,不能单独为标准块大小设置 DB_2K_CACHE_SIZE
、DB_4K_CACHE_SIZE
等。
6. 使用 Oracle Enterprise Manager 配置额外的缓存
如果你希望通过 Oracle Enterprise Manager (OEM) 配置这些缓存参数,可以按照以下步骤操作:
-
登录到 Oracle Enterprise Manager 控制台。
-
导航到 Configuration。
-
选择 All Initialization Parameters(所有初始化参数)。
-
修改相关参数,具体包括:
DB_2K_CACHE_SIZE
DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE
DB_32K_CACHE_SIZE
-
点击 OK 保存修改。
7. 配置示例
假设你有一个数据库,使用 8 KB 和 16 KB 的块大小,你可以这样配置缓存:
DB_CACHE_SIZE
:指定 8 KB 块大小的缓存。DB_16K_CACHE_SIZE
:指定 16 KB 块大小的缓存。
通过合理配置这些缓存参数,可以优化数据库的性能,特别是在使用多个块大小的数据库环境中。
总结
- DB_CACHE_SIZE 控制标准块大小的缓存大小。
- DB_nK_CACHE_SIZE 用于控制特定非标准块大小的缓存。
- 必须为每个使用的非标准块大小配置相应的缓存参数。
- 配置时需要注意平台的块大小限制。
- Oracle Enterprise Manager 提供了一个方便的界面来配置这些缓存参数。
合理的缓存配置可以显著提高数据库性能,尤其是在涉及多个表空间和块大小时。
Oracle9i 中如何创建非标准块大小的表空间
1. 非标准块大小表空间的创建
在 Oracle 中,表空间的默认块大小通常是 8 KB。但你可以使用 BLOCKSIZE
子句来创建一个具有非标准块大小的表空间。这允许你根据需要为不同类型的数据配置不同的块大小。
示例:
CREATE TABLESPACE tbs_1
DATAFILE 'tbs_1.dbf'
SIZE 10M BLOCKSIZE 4K;
- BLOCKSIZE 4K:这里指定了表空间的块大小为 4 KB。
DATAFILE 'tbs_1.dbf' SIZE 10M
:指定了表空间的文件大小为 10MB。
2. 指定块大小时的配置要求
在创建具有非标准块大小的表空间时,Oracle 数据库的缓冲区缓存(Buffer Cache)必须支持指定的块大小。因此,除了创建表空间时使用 BLOCKSIZE
子句外,还需要配置初始化参数。
缓存参数:
- DB_CACHE_SIZE:该参数用于设置数据库缓冲区缓存的大小,缓存的块大小默认为标准块大小(例如 8 KB)。它控制数据库的标准块缓存。
- DB_nK_CACHE_SIZE:这是针对每个非标准块大小的缓存参数。例如,如果要使用 4 KB 块大小的表空间,必须设置
DB_4K_CACHE_SIZE
参数,指示为该块大小分配缓冲区。
例如:
-
如果要创建一个 4 KB 块大小的表空间,就必须配置
DB_4K_CACHE_SIZE
参数。ALTER SYSTEM SET DB_4K_CACHE_SIZE = 500M;
配置的规则:
- 如果使用
BLOCKSIZE
子句指定了某个非标准块大小(例如 4 KB、2 KB 等),你必须确保DB_nK_CACHE_SIZE
对应的缓存参数已设置,并且设置的值与块大小相匹配。
3. 限制条件
-
临时表空间的限制:
你不能为 临时表空间(即通过TEMPORARY
关键字指定的表空间)指定非标准块大小。- 例如,以下语句会失败,因为它尝试为临时表空间指定一个非标准块大小:
CREATE TEMPORARY TABLESPACE tbs_temp DATAFILE 'tbs_temp.dbf' SIZE 10M BLOCKSIZE 4K;
- 临时表空间通常用于排序、临时存储等操作,它的性能要求与常规表空间不同,因此 Oracle 禁止为其指定非标准块大小。
- 例如,以下语句会失败,因为它尝试为临时表空间指定一个非标准块大小:
-
与用户的临时表空间关联:
如果你计划将某个表空间指定为用户的临时表空间,则该表空间也不能使用非标准块大小。
4. 字典视图和查看块大小
在 Oracle 数据库中,有一个 *_TABLESPACES
字典视图(如 DBA_TABLESPACES
),它显示了所有表空间的信息。自 Oracle 9i 起,添加了一个新的列 BLOCK_SIZE
,它记录每个表空间所使用的块大小。
你可以通过查询字典视图来查看表空间的块大小:
SELECT TABLESPACE_NAME, BLOCK_SIZE
FROM DBA_TABLESPACES;
输出示例:
TABLESPACE_NAME BLOCK_SIZE
---------------- ------------
TBS_1 4096
TBS_2 8192
...
此查询将列出所有表空间及其对应的块大小(以字节为单位)。
5. 成功创建表空间的前提条件
在你能够成功创建一个具有非标准块大小的表空间之前,必须满足以下条件:
- 缓存必须已经配置:例如,若你创建一个 4 KB 块大小的表空间,系统中必须已经设置了
DB_4K_CACHE_SIZE
,并且该缓存应该是有效的(即有足够的内存来支持该缓存)。 - 块大小匹配:
BLOCKSIZE
子句中指定的块大小(如 4K)必须与数据库初始化参数中的对应缓存(如DB_4K_CACHE_SIZE
)匹配。
6. 总结
-
创建非标准块大小表空间:
- 使用
BLOCKSIZE
子句来指定块大小,如BLOCKSIZE 4K
、BLOCKSIZE 2K
等。 - 需要确保数据库中配置了对应的缓存参数(如
DB_4K_CACHE_SIZE
),否则创建表空间会失败。
- 使用
-
缓存配置要求:
- 如果表空间使用了非标准块大小(例如 4 KB、8 KB、16 KB 等),则需要为这些块大小配置相应的缓存,如
DB_4K_CACHE_SIZE
。
- 如果表空间使用了非标准块大小(例如 4 KB、8 KB、16 KB 等),则需要为这些块大小配置相应的缓存,如
-
限制:
- 不能为临时表空间指定非标准块大小。
- 不能将非标准块大小表空间用作用户的临时表空间。
-
字典视图:
- 通过查询
DBA_TABLESPACES
等字典视图,可以查看表空间的块大小。
- 通过查询
通过合理配置这些参数,可以优化数据库的性能,尤其是在有多个表空间且不同块大小的数据库环境中。
多个块大小规则
1. 分区对象
- 规则:所有分区对象的分区必须存储在使用相同块大小的表空间中。
- 解释:对于分区表、分区索引或其他分区对象,所有分区必须使用相同的块大小。不能将一个分区对象的不同分区存放在使用不同块大小的表空间中。每个分区表的所有分区在块大小上必须一致。
2. 临时表空间
- 规则:所有临时表空间,包括作为默认临时表空间使用的永久表空间,必须使用标准块大小。
- 解释:临时表空间用于处理排序、哈希以及临时数据存储等操作。临时表空间必须使用系统的标准块大小(通常是 8 KB,或者根据系统配置的块大小)。不能为临时表空间指定非标准块大小(如 4 KB、16 KB 等)。
3. 索引组织表溢出段和外部存储的 LOB 段
- 规则:索引组织表(IOT)溢出段和外部存储的 LOB 段可以存储在与基表块大小不同的表空间中。
- 解释:虽然 索引组织表(IOT) 的基表或 LOB(大对象) 的基表可能有某个块大小,但 Oracle 允许这些表的溢出段或 LOB 段存储在与基表块大小不同的表空间中。这样可以针对特定数据类型(例如 LOB 或 IOT 的溢出数据)优化存储,因为这些数据类型可能有不同的访问模式或存储需求。
关键规则总结:
- 分区对象:所有分区必须在相同块大小的表空间中。
- 临时表空间:必须使用标准块大小。
- 溢出段和 LOB 段:可以使用与基表不同的块大小。
Oracle 数据块(Database Block)
1. Oracle 数据块的结构
Oracle 数据块(也称为数据库块)是 Oracle 存储数据的最小单元。每个数据块通常包含三个部分:
-
块头(Block Header):
- 内容:块头包含数据块的地址、表目录、行目录和事务槽等信息。
- 作用:块头用于记录有关数据块的元数据,帮助 Oracle 数据库管理数据块。事务槽用于追踪对该块中行的操作,当事务修改某行数据时,会在事务槽中创建一条记录。
- 增长方式:块头从数据块的顶部向下增长,逐渐填充块头部分的信息。
-
数据空间(Data Space):
- 内容:数据行(Row Data)存储在数据空间中。
- 作用:Oracle 将行数据从数据块的底部开始向上插入,以便在数据块中逐步填充空间。
- 增长方式:数据空间的增长是从数据块底部开始的,数据行是逐行存储的。
-
空闲空间(Free Space):
- 内容:空闲空间位于数据块的中部,用于存储后续插入的新行或更新数据时留下的空间。
- 作用:在表插入数据、更新数据时,空闲空间使得数据块能够容纳新的行或修改。
- 增长方式:空闲空间是连续的,并且随着行的插入和更新会发生变化。空闲空间可能会变得碎片化,这时 Oracle 会进行空间合并(Coalescing)以优化空间使用。
2. 块空间利用参数
为了有效管理和优化数据块的空间利用,Oracle 提供了多个参数,用于控制数据块空间的分配和使用。以下是这些参数的详细解释:
2.1 控制并发性的参数: INITRANS
和 MAXTRANS
-
INITRANS
:设置每个块初始化时创建的事务槽的最小数量。事务槽用于跟踪同时对同一个数据块进行更改的事务。- 默认:数据段的默认值为 1,索引段为 2。
- 作用:
INITRANS
保证了块内并发事务的最小数量。如果INITRANS
设置为 3,Oracle 会确保至少有 3 个事务可以并发地修改这个数据块。超过这个数量的事务会使用额外的事务槽,这些事务槽从空闲空间中分配。
-
MAXTRANS
:设置一个数据块中可以同时进行更改的最大事务数。- 默认:255。
- 作用:该参数限制了事务槽的数量,确保有足够的空间用于事务操作,而不会占用太多数据空间,影响数据行的存储。
2.2 控制数据空间利用的参数: PCTFREE
和 PCTUSED
-
PCTFREE
:指定每个数据块中预留空间的百分比,用于容纳由于更新数据而需要增加的行空间。- 默认:10%。
- 作用:当数据行在块中被更新时,Oracle 会使用
PCTFREE
参数指定的空间来处理更新所需的空间。如果更新后的数据行增大,Oracle 会将其保留在该空间中。 - 计算方式:
PCTFREE
是基于数据空间的百分比计算的,而数据空间是指在扣除块头空间后的剩余部分。
-
PCTUSED
:指定数据块中必须使用的最小空间百分比。只有当块的使用空间超过PCTUSED
参数时,Oracle 才会将块从空闲块列表中取出并用于新的插入。- 默认:40%。
- 作用:如果数据块中的使用空间小于
PCTUSED
,该块将被放回空闲块列表中,等待插入新的数据行。PCTUSED
保证了数据块的最低使用率。 - 计算方式:
PCTUSED
是基于数据空间计算的。
2.3 控制空闲空间的利用: FREELISTS
FREELISTS
:指定一个表或段使用的空闲空间列表的数量。通过增加空闲空间列表,Oracle 可以提高并发插入的效率,减少锁竞争。- 作用:通过配置多个空闲列表,Oracle 可以在多个并发插入操作时,减少等待和锁冲突,从而提高插入性能。
3. 这些参数的优化作用
- 提高并发性:
INITRANS
和MAXTRANS
参数通过管理每个数据块可以并发处理的事务数,确保数据库在高并发环境下仍能正常工作,并最大化并发事务的吞吐量。 - 优化空间利用:
PCTFREE
和PCTUSED
确保数据块空间得到了合理的管理,避免了过多的空闲空间和存储碎片,确保数据块空间利用最大化。 - 减少插入冲突:通过配置多个
FREELISTS
,可以在并发插入操作中减少锁的争用,提高性能。
4. 拓展:数据块空间利用与性能优化
- 空间碎片化与合并:随着数据的插入、更新和删除,数据块中的空闲空间可能会变得碎片化,这影响了块的空间利用率。Oracle 会在必要时自动进行空闲空间合并(coalescing),以确保更高效的存储。
- 合理设置
PCTFREE
和PCTUSED
:在设计数据库时,需要根据数据更新的特点来设置这些参数。例如,如果表中的数据行更新频繁,可以将PCTFREE
设置为较高值,以便为更新操作留出更多空间。如果表中的数据不经常更新,可以将PCTUSED
设置为较低值,以便更早地将块返回到空闲列表。
总结:
- 数据块结构:包括块头、数据空间和空闲空间。
- 空间利用参数:包括
INITRANS
、MAXTRANS
、PCTFREE
、PCTUSED
和FREELISTS
,这些参数帮助管理数据块的空间利用、并发事务、更新空间预留和插入冲突。 - 优化:合理配置这些参数可以有效提高数据库的并发性能、存储利用率和整体性能。