百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

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

sinye56 2024-10-09 19:53 6 浏览 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)数,这些事务槽在索引块或者数据块内创建。事务槽用来存储在某一时间点对块进行更改的事务处理的有关信息。一个事务只占用一个事务槽。

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%) 以下,则该块可用于重新插入。

(二)、段空间自动管理

段空间管理方式可以采用自动段空间管理的方式,它是一种在数据库段内管理空闲空间的方法。自动段空间管理使用位图完成对段内空闲和已用空间的跟踪(与使用空闲列表相对)。位图段包含一个位图,它描述了与段中的可用空间相关的每个块的状态。该位图包含在单独的一组块中,这些块称为“位图块”,插入新行时,服务器就会在该位图中搜索是否具有足够空间的块,有则插入数据。当块中的可用空间数量发生变化时,位图中就会反映出它的新状态。使用自动段空间管理更方便、空间使用率更高,并且改进了并发 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等存储参数,以指定其中区的分配方式。可以创建非标志块表空间,以满足不同的存储空间需求。


写在最后的话

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

相关推荐

Linux基础知识之修改root用户密码

现象:Linux修改密码出现:Authenticationtokenmanipulationerror。故障解决办法:进入单用户,执行pwconv,再执行passwdroot。...

Linux如何修改远程访问端口

对于Linux服务器而言,其默认的远程访问端口为22。但是,出于安全方面的考虑,一般都会修改该端口。下面我来简答介绍一下如何修改Linux服务器默认的远程访问端口。对于默认端口而言,其相关的配置位于/...

如何批量更改文件的权限

如果你发觉一个目录结构下的大量文件权限(读、写、可执行)很乱时,可以执行以下两个命令批量修正:批量修改文件夹的权限chmod755-Rdir_name批量修改文件的权限finddir_nam...

CentOS「linux」学习笔记10:修改文件和目录权限

?linux基础操作:主要介绍了修改文件和目录的权限及chown和chgrp高级用法6.chmod修改权限1:字母方式[修改文件或目录的权限]u代表所属者,g代表所属组,o代表其他组的用户,a代表所有...

Linux下更改串口的权限

问题描述我在Ubuntu中使用ArduinoIDE,并且遇到串口问题。它过去一直有效,但由于可能不必要的原因,我觉得有必要将一些文件的所有权从root所有权更改为我的用户所有权。...

Linux chown命令:修改文件和目录的所有者和所属组

chown命令,可以认为是"changeowner"的缩写,主要用于修改文件(或目录)的所有者,除此之外,这个命令也可以修改文件(或目录)的所属组。当只需要修改所有者时,可使用...

chmod修改文件夹及子目录权限的方法

chmod修改文件夹及子目录权限的方法打开终端进入你需要修改的目录然后执行下面这条命令chmod777*-R全部子目录及文件权限改为777查看linux文件的权限:ls-l文件名称查看li...

Android 修改隐藏设置项权限

在Android系统中,修改某些隐藏设置项或权限通常涉及到系统级别的操作,尤其是针对非标准的、未在常规用户界面显示的高级选项。这些隐藏设置往往与隐私保护、安全相关的特殊功能有关,或者涉及开发者选项、权...

完蛋了!我不小心把Linux所有的文件权限修改了!在线等修复!

最近一个客户在群里说他一不小心把某台业务服务器的根目录权限给改了,本来想修改当前目录,结果执行成了根目录。...

linux改变安全性设置-改变所属关系

CentOS7.3学习笔记总结(五十八)-改变安全性设置-改变所属关系在以前的文章里,我介绍过linux文件权限,感兴趣的朋友可以关注我,阅读一下这篇文章。这里我们不在做过的介绍,注重介绍改变文件或者...

Python基础到实战一飞冲天(一)--linux基础(七)修改权限chmod

#07_Python基础到实战一飞冲天(一)--linux基础(七)--修改权限chmod-root-groupadd-groupdel-chgrp-username-passwd...

linux更改用户权限为root权限方法大全

背景在使用linux系统时,经常会遇到需要修改用户权限为root权限。通过修改用户所属群组groupid为root,此操作只能使普通用户实现享有部分root权限,普通用户仍不能像root用户一样享有超...

怎么用ip命令在linux中添加路由表项?

在Linux中添加路由表项,可以使用ip命令的route子命令。添加路由表项的基本语法如下:sudoiprouteadd<network>via<gateway>这...

Linux配置网络

1、网卡名配置相关文件回到顶部网卡名命名规则文件:/etc/udev/rules.d/70-persistent-net.rules#PCIdevice0x8086:0x100f(e1000)...

Linux系列---网络配置文件

1.网卡配置文件在/etc/sysconfig/network-scripts/下:[root@oldboynetwork-scripts]#ls/etc/sysconfig/network-s...

取消回复欢迎 发表评论: