本文希望通过系统地介绍这方面的有关概念 让大家能更好地规划使用数据空间 正确使用Oracle提供的有关功能特性 提高应用的执行效率
数据库空间的有效使用和维护不仅是数据库管理的重要工作 也是大多数开发人员所关心的内容 因为它直接关系到数据库性能的发挥 同时数据碎片是经常令人头疼的问题 碎片不仅造成空间的浪费 更重要的是会直接影响应 用程序的响应速度
Oracle提供了不少方法用于数据空间的使用 监控和维护 同时也在各版本中陆续对这方面的功能进行了增强 目的在于简化这方面工作的复杂度 提高应用的运行效率
一 相关概念
数据库的空间在逻辑上分为多个表空间 每个表空间则由系统中的一个或多个物理数据文件构成 Oracle存储数据的基本单位是块 其大小在建库时由DB_BLOCK_SIZE参数确定 一个或多个连续的块构成一个区片(EXTENT) 它作为数据对象存储的基本单位来使用 在Oracle中 每个基本数据对象使用的空间称为段(Segment) 段存放在唯一的表空间上 每个段实际上是一系列区片(更为准确地是数据块)的集合 每个简单数据对象对应一个段 对于分区对象如分区表 索引 则每个(子)分区对应一个段 由各个(子)分区共同构成一个完整的数据对象 因此 可以把表空间看作桶 里面放著许多段 一个段只能放在一个桶中 而不能跨越多个桶
二 表空间的使用
表空间碎片的产生
由于同一个表空间中存放有多个数据段 各个数据段可以有不同的区片尺寸 不同段的区片可以交叉存放 当这些段中的区片经过分配(如创建表) 释放(如删除表)后 就可能使表空间中原本连续的空闲数据块变成不连续 而区片必须由连续的数据块构成 这时 当某一段需要分配新的区片时 就有可能出现虽然表空间空闲数据块的总和大于所需区片的大小 但却无法找到一串连续的块来供此区片分配使用 这种情况就称为表空间的Extent Fragmentation 我们经常会遇到这种情况 明明从DBA_FREE_SPACE中计算表空间还有几百MB 但其中的某一个表却无法再扩展几个MB的空间
消除表空间碎片
Oracle在段的区片分配上为用户提供了很大的灵活性 然而如果未能正确使用创建表空间和数据对象的各个可选择参数 则在最后将不可避免的要面对区片碎片的问题 Oracle 的Bhaskar Himatsingka 和 Juan Loaiza 为此提出了SAFE(Simple Algorithm for Fragmentation Elimination )配制规则 通过遵循这套规则 区片级碎片可以完全的避免 而实际上 Oracle i引入的新特性 Local Managed Tablespace就是SAFE规则在Oracle Server的内置实现 SAFE原则概括起来包括
对每个表空间上的段使用相同的区片尺寸 段参数INITIAL=NEXT PCTINCREASE= 可以通过使用Create Tablespace 的 MINIMUM EXTENT 子句来确保分配的区片是此参数的倍数
仅在表空间级指定INITIAL NEXT参数 在创建数据段时不要指定这些参数
区片的大小根据段大小来确定 原则是均衡顺序扫描的效率和空间的利用率 同时确保段的区片数目控制在 之下 根据此原则 在进行相应测试之后 确定以下区片选取规则
段大小(Oracle ) 区片大小(Oracle ) 段大小(Oracle ) 区片大小(Oracle ) & M K & M K M G M M G M & G M & G M
有此数据库中可以只使用三种区片大小的表空间 在对象创建之前需对其大小进行评估 并放到相应的表空间中
Oracle 引入了本地管理表空间 它在管理和性能上都优于传统的字典管理表空间 它已融合了规则 要使用此特性 在CREATE TABLESPACE语句中指定EXTENT MANAGEMENT LOCAL子句
段的区片数目上限应在 之下 DML *** 作在此区片数目范围内不会有明显的性能差异 但某些DDL *** 作的速度则与区片的数目关系较大 因此合理的区片数目应保持在 之下 对于持续不断扩展的段 应监控区片数目 在必要时移至其它表空间
对于特别大的数据段应控制在 G G(Oracle 为 G G)之间 它们应存放到单独的表空间上 同时对于这些特大段应考虑使用分区拉提高性能
用户的临时表空间应使用TEMPORARY类型
当系统的事务规模比较均衡时可以对回滚段使用OPTIMAL参数 否则应避免制定OPTIMAL参数 而定期监控回滚段的大小 并在必要时重建
临时段和回滚段绝对不要将用户数据存放到SYSTEM表空间 它是专为永远不会Drop和Truncate的系统数据对象而设计的
创建表空间时指定数据文件的大小应=区片整数倍+ 数据块 对于Local Managed Tablespace则为区片整数倍+ K
当表空间使用统一的区片大小时 不要对其进行空间整理 重整的结果不仅耗费精力而且可能会使性能变差 对于未使用统一的区片尺寸的表空间应通过Export/Import重整
i 提供了Alter Table …Move [Tablespace…]命令可用于快速重整表 Alter Index …Rebuild…[Tablespace…] 命令可用于快速重建索引
有关使用单个区片的误导
在许多关于碎片整理的文档中建议在Export时使用Compress=Y选项 将表中的所有数据调整到一个区片中 期望在Import后获得良好性能 由此让许多人产生一个观点 认为当表中数据全部存放到一个区片中时 可以获得良好性能 实际上单区片段只在以下条件成立时 才具有优越性
数据主要以(全段)扫描方式访问
段所对应的数据块在物理磁盘上连续存放 Oracle可以发布较大的顺序磁盘读 *** 作
通过对这两条进行分析可以发现 一方面数据库中大部分表是通过索引来访问 另一方面现在的数据库文件一般在物理上使用了RAID 或RAID + 技术 数据以条带化方式分布到多个物理磁盘上 逻辑上的单个区片和多区片在物理上并无本质上的区别 另外 从Oracle的角度来看 管理几百个区片的段是非常轻松的并不会有性能的下降 由此可见将整个段放到一个区片中并无明显好处 而这种做法却会导致表空间碎片的产生
三 表数据段的使用
表空间的组织
Heap表的空间由一系列区片链接而成 每个数据块除块头外其余部分可用于存放数据 在创建表时可以指定以下参数
PCTFREE 块中保留用于UPDATE *** 作的空间百分比 当数据占用的空间达到此上限时 新的数据将不能再插入到此块中
PCTUSED 指定块中数据使用空间的最低百分比 当一个块在达到PCTFREE 之后经历了一些DELETE *** 作 在其空间使用下降到PCTUSED后便可以重新被用于INSERT数据 这就是PCTFREE/PCTUSED参数的含义
调整PCTFREE PCTUSED参数的目标一方面是提高性能 另一方面则主要是提高空间使用效率 避免出现块中存在有许多未用的空间 但却无法找到一个块可以被用于插入新数据行的情况发生
PCTFREE的使用
在Oracle中表的每一行数据由唯一的ROWID标记 而Oracle支持的数据类型中有一些长度是可变的 如VARCHAR 当对这些数据进行UPDATE时 如果块中的可用空间不能容纳UPDATE后的数据行时 Oracle将会把此行移到其它数据块 同时保留此数据行的ROWID不变 并在原有块中建一指针指向行迁移后的位置 在这种情况下读取一行数据将需要访问 个数据块 从而导致性能下降 PCTFREE保留的空间就是为确保更改后的数据行可以仍存放于原有数据块中 避免行迁移的情况发生
由此 如果PCTFREE设置不足时可能产生行迁移 而另一方面如果PCTFREE设置过高 将会造成空间浪费 因此正确设置PCTFREE需要对表中数据的使用进行分析 对于数据长度不会变化或极少更新的情况 可以采用较小的PCTFREE 对于其它大多数情况应采用稍大的PCTFREE(PCTFREE的缺省值是 如果不好估计需预留的空间 可以使用 的范围) 不要为节约块中的空间而使用较小的PCTFREE值
PCTUSED的使用
当块的使用的空间下降到PCTUSED后 此块被重新放回空闲链表(Freelist)中 作为后续Insert的候选块 同样 设置PCTUSED需要视数据行的特性和Insert Update Delete的模式而定 但必须遵守的原则是 db_block_size ( PCTFREE PCTUSED)必须比行的长度大
对于数据行长度变化较大的情况 应使用最大行长度来计算PCTUSED 并且应使用较低的PCTUSED值 因为在执行Insert时 如果数据块的可用空间不能装下一行数据 当块的使用的空间是在PCTUSED之上 Oracle将把此块从Freelist中移走 当块的使用的空间是在PCTUSED之下 Oracle将会扩展段空间 因此 PCTUSED如果设得过高 将导致段的不断扩展
lishixinzhi/Article/program/Oracle/201311/18776
Oracle数据库的体系结构包括四个方面:数据库的物理结构、逻辑结构、内存结构及进程。
1 物理结构
物理数据库结构是由构成数据库的 *** 作系统文件所决定,Oracle数据库文件包括:
数据文件(Data File)
数据文件用来存储数据库中的全部数据,例如数据库表中的数据和索引数据通常以为dbf格式,例如:userCIMSdbf 。
日志文件(Redo Log File)
日志文件用于记录数据库所做的全部变更(如增加、删除、修改)、以便在系统发生故障时,用它对数据库进行恢复。名字通常为Logdbf格式,如:Log1CIMSdbf,Log2CIMSdbf 。
控制文件(Control File)
每个Oracle数据库都有相应的控制文件,它们是较小的二进制文件,用于记录数据库的物理结构,如:数据库名、数据库的数据文件和日志文件的名字和位置等信息。用于打开、存取数据库。名字通常为Ctrlctl 格式,如Ctrl1CIMSctl。
配置文件
配置文件记录Oracle数据库运行时的一些重要参数,如:数据块的大小,内存结构的配置等。名字通常为initora 格式,如:initCIMSora 。
2 逻辑结构
Oracle数据库的逻辑结构描述了数据库从逻辑上如何来存储数据库中的数据。逻辑结构包括表空间、段、区、数据块和模式对象。数据库的逻辑结构将支配一个数据库如何使用系统的物理空间模式对象及其之间的联系则描述了关系数据库之间的设计
一个数据库从逻辑上说是由一个或多个表空间所组成,表空间是数据库中物理编组的数据仓库,每一个表空间是由段(segment)组成,一个段是由一组区(extent)所组成,一个区是由一组连续的数据库块(database block)组成,而一个数据库块对应硬盘上的一个或多个物理块。一个表空间存放一个或多个数据库的物理文件(即数据文件)一个数据库中的数据被逻辑地存储在表空间上。
表空间(tablespace)
Oracle数据库被划分为一个或多个称为表空间的逻辑结构,它包括两类表空间,System表空间和非System表空间,其中,System表空间是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程、包、函数和触发器的定义以及系统回滚段。除此之外,还能包含用户数据。。
一个表空间包含许多段,每个段有一些可以不连续的区组成,每个区由一组连续的数据块组成,数据块是数据库进行 *** 作的最小单位。
每个表空间对应一个或多个数据文件,每个数据文件只能属于一个表空间。
数据库块(database block)
数据库块也称逻辑块或ORACLE块,它对应磁盘上一个或多个物理块,它的大小由初始化参数db-block-size(在文件initora中)决定,典型的大小是2k。Pckfree 和pctused 两个参数用来优化数据块空间的使用。
区(extent)
区是由一组连续的数据块所组成的数据库存储空间分配的逻辑单位。
段(segment)
段是一个或多个不连续的区的集合,它包括一个表空间内特定逻辑结构的所有数据,段不能跨表空间存放。Oracle数据库包括数据段、索引段、临时段、回滚段等。
模式对象(schema object)
Oracle数据库的模式对象包括表、视图、序列、同意词、索引、触发器、存储过程等,关于它们将重点在后面章节介绍。
3.Oracle Server系统进程与内存结构
当在计算机服务器上启动Oracle数据库后,称服务器上启动了一个Oracle实例(Instance)。ORACLE 实例(Instance)是存取和控制数据库的软件机制,它包含系统全局区(SGA)和ORACLE进程两部分。SGA是系统为实例分配的一组共享内存缓冲区,用于存放数据库实例和控制信息,以实现对数据库中数据的治理和 *** 作。
进程是 *** 作系统中一个极为重要的概念。一个进程执行一组 *** 作,完成一个特定的任务对ORACLE数据库治理系统来说,进程由用户进程、服务器进程和后台进程所组成。
当用户运行一个应用程序时,系统就为它建立一个用户进程。服务器进程处理与之相连的用户进程的请求,它与用户进程相通讯,为相连的用户进程的ORACLE请求服务。
为了提高系统性能,更好地实现多用户功能,ORACLE还在系统后台启动一些后台进程,用于数据库数据 *** 作。
系统进程的后台进程主要包括:
SMON 系统监控进程:(system monitor)负责完成自动实例恢复和回收分类(sort)表空间。
PMON 进程监控进程:(PRocess monitor)实现用户进程故障恢复、清理内存区和释放该进程所需资源等。
DBWR 数据库写进程:数据库缓冲区的治理进程。
在它的治理下,数据库缓冲区中总保持有一定数量的自由缓冲块,以确保用户进程总能找到供其使用的自由缓冲块。
LGWR 日志文件写进程:是日志缓冲区的治理进程,负责把日志缓冲区中的日志项写入磁盘中的日志文件上。每个实例只有一个LGWR进程。
ARCH 归档进程:(archiver process)把已经填满的在线日志文件拷贝到一个指定的存储设备上。仅当日志文件组开关(switch)出现时,才进行ARCH *** 作。ARCH不是必须的,而只有当自动归档可使用或者当手工归档请求时才发出。
RECO 恢复进程:是在具有分布式选项时使用的一个进程,主要用于解决引用分布式事务时所出现的故障。它只能在答应分布式事务的系统中出现。
LCKn 封锁进程:用于并行服务器系统,主要完成实例之间的封锁。
内存结构(SGA)
SGA是Oracle为一个实例分配的一组共享内存缓冲区,它包含该实例的数据和控制信息。SGA在实例启动时被自动分配,当实例关闭时被收回。数据库的所有数据 *** 作都要通过SGA来进行。
SGA中内存根据存放信息的不同,可以分为如下几个区域:Buffer Cache:存放数据库中数据库块的拷贝。它是由一组缓冲块所组成,这些缓冲块为所有与该实例相链接的用户进程所共享。缓冲块的数目由初始化参数DB_BLOCK_BUFFERS确定,缓冲块的大小由初始化参数DB_BLOCK_SIZE确定。大的数据块可提高查询速度。它由DBWR *** 作。
b 日志缓冲区Redo Log Buffer:存放数据 *** 作的更改信息。它们以日志项(redo entry)的形式存放在日志缓冲区中。当需要进行数据库恢复时,日志项用于重构或回滚对数据库所做的变更。日志缓冲区的大小由初始化参数LOG_BUFFER确定。大的日志缓冲区可减少日志文件I/O的次数。后台进程LGWR将日志缓冲区中的信息写入磁盘的日志文件中,可启动ARCH后台进程进行日志信息归档。
c 共享池Shared Pool:包含用来处理的SQL语句信息。它包含共享SQL区和数据字典存储区。共享SQL区包含执行特定的SQL语句所用的信息。数据字典区用于存放数据字典,它为所有用户进程所共享。
Cursors:一些内存指针,执行待处理的SQL语句
其他信息区:除了上述几个信息区外,还包括一些进程之间的通讯信息(如封锁信息);在多线索服务器配置下,还有一些程序全局区的信息,请求队列和响应队列等。 本文来自: >
以上就是关于Oracle数据库空间管理和规划全部的内容,包括:Oracle数据库空间管理和规划、oracle数据库的结构是什么、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)