编程教育资源分享平台

网站首页 > 后端开发 正文

Oracle 逻辑结构篇 之逻辑结构(四)数据块和段空间管理

luoriw 2024-02-01 14:31:38 后端开发 14 ℃ 0 评论

五、数据块

块是 Oracle 数据库执行输入/输出(I/O) 的最小单位,相应地,操作系统执行输入/出(I/O) 的最小单位为一个操作系统块的大小。假定某用户执行“SELECT* FROM emp WHEREempno=7788”只会返回 100Byte 的数据,而数据块尺寸为 2KB,那么 Oracle 会在数据文件上读取多少数据到数据高速缓存呢?因为 Oracle 数据库输入/输出的最小单位是块,所以一次读取的数据是一个数据块,即读取是 2 KB 的数据。

在 Oracle9i 之前,同一个数据库的所有表空间必须具有相同的数据块尺寸;而从Oracle9i 开始,不同表空间可以具有不同的数据块尺寸。

(一)、多重数据块支持

Oracle9i 支持创建具有多种块大小的数据库。此功能在下列情况下非常有用:? 将表空间从联机事务处理(OLTP) 数据库传送到企业数据仓库时。使用 Oracle9i,可方便地在具有不同块大小的数据库之间传送数据。? 要求能够在具有相应块大小的表空间中定位对象以最大限度地提高 I/O 性能时使用 Oracle9i,除了标准的块大小外,还可以指定最多四种非标准的块大小,如果想使用非标准大小的块,必须在初始化参数文件中,为每个非标准块大小配置子高速缓存。也可以在实例运行过程中配置子高速缓存,可以创建具有其中任意块大小的表空间。如果创建的表空间是非标准块大小,那么在建立表空间时使用 BLOCKSIZE 选项定义表空间所使用的非标准块尺寸。

(二)、标准块与非标准块大小

1.标准块大小

在 SYSTEM 表空间以及任何临时表空间中使用的块大小为标准块大小,除非进行指定,表空间的缺省块大小为标准块。数据块尺寸是由初始化参数 DB_BLOCK_SIZE 指明,其尺寸应该设置为操作系统(OS)块尺寸的整数倍,所以一个数据块由一个或多个操作系统块组,并且该参数的取值一般为 2KB、4KB、8KB、16KB、32KB 等。

通常,将 DB_BLOCK_SIZE 设置为 4 KB 或 8 KB。如果没有指定,则使用缺省数据块小,缺省数据块大小取决于所用的操作系统,在创建数据库后将不能更改标准块大小,如果想更改标准块大小,只能重新创建数据库。使用 DB_CACHE_SIZE 参数指定标准块大小缓冲区的高速缓存大小。DB_CACHE_SIZE 最小值为一个粒组(granule),默认为 48MB.粒组大小由 SGA 来决定,如果 SGA<128MB,一个 granule 则是 4MB,如果 SGA>128MB,一个 granule 则 是 16MB。

2.非标准块大小

从 Oracle 9i 开始,除可以使用标准块大小外,还可以使用非标准块大小,取值范围是2KB、4KB、8KB、16KB、32KB。如果希望使用非标准块,必须在数据库缓冲区为数据库使用的各种块大小指定高速缓存大小。即如果要在数据库中使用多种块大小,则必须设置DB_CACHE_SIZE 和至少一个 DB_nK_CACHE_SIZE 参数。每个参数为相应的块大小指定了缓冲区高速缓存大小。如下所示:

DB_2K_CACHE_SIZE 为 2KB 的块指定数据库高速缓存大小

DB_4K_CACHE_SIZE 为 4KB 的块指定数据库高速缓存大小

DB_8K_CACHE_SIZE 为 8KB 的块指定数据库高速缓存大小

DB_16K_CACHE_SIZE 为 16KB 的块指定数据库高速缓存大小

DB_32K_CACHE_SIZE 为 32KB 的块指定数据库高速缓存大小

如果 nK 是标准块大小,则不能指定的大小,DB_nK_CACHE_SIZE 参数的缺省值为零。如果存在块大小为 nKB 的联机表空间,则不要将此参数设置为零。最小可以设一个 granule。

(三)、创建非标准块表空间

可创建标准块大小的表空间,也可以创建非标准块大小表空间,使用 BLOCKSIZE 子句为表空间指定非标准块大小,要指定该子句,必须设置 DB_CACHE_SIZE 和至少一个DB_nK_CACHE_SIZE 参数,在该子句中指定的整数必须与某个 DB_nK_CACHE_SIZE 参数中的 对应。

【实例4-1】创建一个 2K 块大小的表空间 mytbs2k,并验证。

1)以 sys 用户登录
CONN / AS SYSDBA已连接
2)设置初始化参数 DB_2K_CACHE_SIZE, 重新启动使参数设置生效
SQL> ALTER SYSTEM SET DB_2k_CACHE_SIZE=16M SCOPE=SPFILE;
系统已更改。
SQL> SHUTDOWN
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUPORACLE 
例程已经启动。
Total System Global Area 47258064 bytes
Fixed Size 453072 bytes
Variable Size 29360128 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
3)创建表空间
CREATE TABLESPACE mytbs2kDATAFILE 'd:\oracle\oradata\db01\mytbs2k_1.dbf' SIZE 10MBLOCKSIZE 2K;
表空间已创建。
4)验证
SQL> SELECT tablespace_name,block_sizeFROM dba_tablespacesWHERE tablespace_name='MYTBS2K';
TABLESPACE_NAME BLOCK_SIZE
------------------------------ ----------
MYTBS2K 2048

执行上述命令后,创建名为 mytbs2k 的表空间,表空间中块的大小为 2KB,查DBA_TABLESPACES 数据字典视图,可以看新建表空间的块大小为 2K。

多种块大小使用要注意:

  • ? 分区对象的所有分区必须位于具有相同块大小的表空间中。
  • ? 所有临时表空间必须采用标准块大小,包括用作缺省临时表空间的永久表空间。
  • ? 按索引组织的表溢出和外部 LOB 段可以存储在块大小与基表不同的表空间中。

(四)、数据块的存储参数

当建立数据对象(表、索引、簇)时,通过指定合理的块空间使用参数可以提高块访问性能和并发性,使用参数可用来控制对数据段和索引段空间的使用。参数分为:控制并性的参数和控制空间使用的参数两类。

1.控制并发性的参数

INITRANS 和 MAXTRANS:指定初始的和最大的事务槽(Transaction slot)数,这些事务槽在索引块或者数据块内创建。事务槽用来存储在某一时间点对块进行更改的事务处理的有关信息。一个事务只占用一个事务槽。

P4-1:数据块的管理参数

INITRANS:保证最低级别的并发性。对于数据段和索引段,INITRANS 的缺省值分别为 1 和 2,以保证最低级别的并发性。例如,设置 INITRANS 的值为 3,那么初始阶段可以有 3 个事务同时访问一个数据块。如果需要,也可以从块空闲空间内分配更多事务槽,以允许更多的事务处理并发修改块内的行。

MAXTRANS:缺省值为 255,它用于设置可更改数据块或者索引块的并发事务处理数的限制。例如 MAXTRANS 的值设为 10 时,访问同一数据块的事务数超过 3 之后,需要为新事务分配新的事务槽,并且最大并发事务个数为 10。

2.控制数据空间使用的参数

PCTFREE:对于数据段而言,此参数用于指定每个数据块中保留空间所占的百分比,当更新块内的行需要更多空间,就会使用保留空间。PCTFREE 的缺省值为 10%。

PCTUSED:对于数据段而言,此参数表示 Oracle 服务器为表内每个数据块所保留的已用空间的最低百分比。如果一个块的已用空间低于 PCTUSED,则将该块放回到空闲列表中。加入段的空闲列表的块可以用于重新插入数据。缺省情况下,每个段在创建时都有一个空列表。通过设置存储子句的 FREELISTS 参数,可以创建有更多空闲列表的段。

PCTUSED 的缺省值为 40%。PCTFREE 和 PCTUSED 都按可用数据空间百分比来计算,可用数据空间是从整个块大小减去块头空间后剩余的块空间。

六、段空间的管理

可以使用两种方法来管理数据块:

  • ? 自动段空间管理
  • ? 手动管理

(一)、手动数据块管理

在以前的 Oracle 版本中,这是唯一可用的方法。而且默认的块管理方式为手动管理。手动数据块管理允许手动配置数据块使用参数,例如:PCTFREE 参数,PCTUSED 参数FREELIST 参数。

下面过程介绍对于 PCTFREE=20 且 PCTUSED=40 的数据段如何管理块内的空间(如图 10-5 所示):

当向块中插入行时,块的空闲空间在减少,直到块内的空闲空间等于或者小于 20%,此时行所占用的块内可用数据空间达到 80% (100 – PCTFREE) 或者更多后,此后则无法在该块内插入数据。

剩余的 20% 可在行大小增长时使用。例如,更新初始为 NULL 的列并分配一个值。样,更新后的块使用率可能超过 80%。

如果由于更新,删除了块内的行或者行大小减少,块使用率可能跌至 80% 以下。但是,仍然无法向块中插入,直到块使用率跌至 PCTUSED(在本例中为 40%) 以下,则该块可用于重新插入。

P4-2:pctfree与pctused参数示意

(二)、段空间自动管理

段空间管理方式可以采用自动段空间管理的方式,它是一种在数据库段内管理空闲空间的方法。自动段空间管理使用位图完成对段内空闲和已用空间的跟踪(与使用空闲列表相对)。位图段包含一个位图,它描述了与段中的可用空间相关的每个块的状态。该位图包含在单独的一组块中,这些块称为“位图块”,插入新行时,服务器就会在该位图中搜索是否具有足够空间的块,有则插入数据。当块中的可用空间数量发生变化时,位图中就会反映出它的新状态。使用自动段空间管理更方便、空间使用率更高,并且改进了并发 INSERT 操作性能。但是不能用于包含 LOB 的表空间。管理方便表现在 PCTUSED、FREELISTS、FREELIST GROUPS 均是自动管理的。所有对象都可以更有效地使用空间,尤其是行大小变化很大的对象。

但要注意:

  • ? 自动段空间管理仅能在表空间级别启用,用于在本地管理的表空间
  • ? 创建表空间后,这些配置将应用于在该表空间中创建的所有段

自 动 段 空 间 管 理 是 通 过 CREATE TABLESPACE 命 令 的 SEGMENT SPACEMANGEMENT AUTO 子句指定的,此后不能更改这些段。如果定义了 PCTUSED、FREELIST和 FREELISTGROUPS,则将其全部忽略。

因为自动段空间管理仅能在表空间级别启用,且只用于在本地管理的表空间,所以只需要创建本地管理的表空间进行指定即可。以下例子创建了一个自动段空间管理表空间。

【实例4-2】设置自动段空间管理

1)管理员方式登录
CONN /AS SYSDBA
2)创建表空间并设置自动段空间管理
SQL> CREATE TABLESPACE mytbs10DATAFILE 'D:/oracle/oradata/db01/mytbs10.dbf' SIZE 5MEXTENT MANAGEMENT LOCAL UNIFORM SIZE 64KSEGMENT SPACE MANAGEMENT AUTO;

只要是创建在 mytbs10 表空间中所有段都是采用自动段空间管理。可以用位图管理的段为:表、索引、按索引组织的表(IOT) 以及 LOB。

(三)、查询存储信息

可以通过以下视图查询表空间、数据文件、段和空闲区与已用区之间的关系等信息:

  • DBA_EXTENTS
  • DBA_SEGMENTS
  • DBA_TABLESPACES
  • DBA_DATA_FILES
  • DBA_FREE_SPACE

【实例 4-3】通过 DBA_SEGMENTS 视图,查看段的区和块的数目。

1)以管理员方式登录
CONN / AS SYSDBA
已连接。
2)查询分配给 EMP 段的区和块的数目。
SQL> SELECT segment_name,extents,blocks,bytesFROM dba_segmentsWHERE owner = 'SCOTT' AND segment_name='EMP';
SEGMENT_NAME EXTENTS BLOCKS BYTES
--------------------------------------------
EMP 1 8 65536

以上查询结果可以看出,SCOTT 模式中 EMP 段,包含了一个区,总大小是 8 个数据块(65536Byte)。

【实例 4-4】使用 DBA_EXTENTS 视图。

1)以管理员方式登录
CONN / AS SYSDBA
2)检查给定段的区的信息
SQL> SELECT extent_id,file_id,block_id,blocksFROM dba_extentsWHERE owner = 'SCOTT' AND segment_name='EMP';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 1 50465 8

该实例查询出 EMP 段包含的区号,文件号,块号和块数。

【实例 4-5】使用 DBA_FREE_SPACE 视图。

1)以管理员方式登录
CONN / AS SYSDBA
2)查询所有表空间的自由空间
SQL> SELECT tablespace_name, count(*),max(blocks), sum(blocks)FROM dba_free_spaceGROUP BY tablespace_name;
TABLESPACE_NAME COUNT(*) MAX(BLOCKS) SUM(BLOCKS)
------------------------------ ---------- ----------- -----------
CWMLITE 2 1328 1360
DRSYS 1 1320 1320
EXAMPLE 1 64 64
INDX 1 3192 3192
MYTBS10 1 632 632
ODM 1 1360 1360
SYSTEM 1 176 176
TOOLS 1 504 504
UNDOTBS1 5 24552 25128
USERS 1 3192 3192
XDB 1 24 24

可见,SYSTEM 表空间的可用空闲空间为 176 个数据块。

七、小结

Oracle 为数据对象所分配的存储空间被称为段,段有多种类型,常见的是表段、还原段、索引段和临时段。存储空间的分配是以区为单位进行的,区由连续的数据块组成。通过指定pctfree、pctused 等参数,来控制其中块存储空间管理方式;通过指定 initial、next、pctincrease等存储参数,以指定其中区的分配方式。可以创建非标志块表空间,以满足不同的存储空间需求。


写在最后的话

感谢各位的支持与阅读,后续会继续推送相关知识和交流,欢迎交流、转发和关注,感谢!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表
最新留言