Oracle数据库碎片产生的原因及碎片整理

数据库碎片是影响数据库性能的一个大因素,应及时发现并整理碎片。

一、 碎片是如何产生的

当创建一个数据库实例时,会分成称为表空间(tablespace)的多个逻辑段(segment),如系统(system)表空间,临时(temporary)表空间等。一个表空间可以包含多个数据范围(extent)和一个或多个自由范围块,即自由空间(free space)。

表空间、段、范围、自由空间的逻辑关系如下:

当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。

最理想的状态就是一个段的数据可被存在单一的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的。     当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择), 而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。

二、碎片对系统的影响

1、导致系统性能减弱

如上所述,当要满足一个空间要求时,数据库将首先查找当前最大的自由范围,而"最大"自由范围逐渐变小,要找到一个足够大的自由范围已变得越来越困难,从而导致表空间中的速度障碍,使数据库的空间分配愈发远离理想状态;

2、浪费大量的表空间

部分extent无法得以自动合并,浪费了大量的表空间。

三、自由范围的碎片计算

由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用FSFI(free space fragmentation index:自由空间碎片索引)值来直观体现:

FSFI=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))

可以看出,FSFI的最大可能值为100(一个理想的单文件表空间)。随着范围的增加,FSFI值缓慢下降,而随着最大范围尺寸的减少,FSFI值会迅速下降。

可以使用如下SQL可以用来计算FSFI值:

/* Formatted on 2011/01/27 14:12:43 (QP5 v5.115.810.9015) */

SELECT   tablespace_name,

SQRT (MAX (blocks) / SUM (blocks))

* (100 / SQRT (SQRT (COUNT (blocks))))

FSFI

FROM   dba_free_space

GROUP BY   tablespace_name

ORDER BY   1;

比如,在某数据库运行上面SQL,得到以下FSFI值:

TABLESPACE_NAME                      FSFI

------------------------------ ----------

QS_OA                          54.3794714

RBS                            59.4603558

SYSAUX                         84.0138802

SYSTEM                         70.5946502

UNDOTBS1                       20.0110492

USERS                                 100

XEZF                           6.52482383  --碎片较多

XEZF_INDEX                     32.1055286

8 rows selected.

时间: 2024-07-31 07:15:32

Oracle数据库碎片产生的原因及碎片整理的相关文章

Oracle数据库检查点未完成的原因

最近在alter日志中发现 Checkpoint not complete 信息 产生此问题的原因具体分析: 首先说一下checkpoint 是什么? chkpoint是一个数据库的内部机制,它存在有两个目的: 1. 保证数据的一致性 系统发生检查点将出发DBWR进程将缓冲区中的脏数据块写入到数据文件,同时更新数据文件中的SCN号,记录联机重做日志文件中LRBA(low redo block address)的位置到控制文件中,当在写入过程中,突然实例崩溃,脏数据块没有完全写入到数据文件中.当实

Oracle 数据库碎片整理

oracle|数据|数据库 Oracle 数据库碎片整理http://www.computerworld.com.cn (2001-05-14 11:15:01)我们知道,oracle作为一种大型数据库,广泛应用于金融.邮电.电力.民航等 数据吞吐量巨大,计算机网络广泛普及的重要部门.对于系统管理员来讲,如何 保证网络稳定运行,如何提高数据库性能,使其更加安全高效,就显得尤为重要 .作为影响数据库性能的一大因素--数据库碎片,应当引起dba的足够重视,及时 发现并整理碎片乃是dba一项基本维护内

Oracle数据库碎片整理

oracle|数据|数据库 我们知道,Oracle作为一种大型数据库,广泛应用于金融.邮电.电力.民航等数据吞吐量巨大,计算机网络广泛普及的重要部门.对于系统管理员来讲,如何保证网络稳定运行,如何提高数据库性能,使其更加安全高效,就显得尤为重要.作为影响数据库性能的一大因素--数据库碎片,应当引起DBA的足够重视,及时发现并整理碎片乃是DBA一项基本维护内容.----1.碎片是如何产生的----当生成一个数据库时,它会分成称为表空间(Tablespace)的多个逻辑段(Segment),如系统(

hibernate3-shh框架连接Oracle数据库报流已被关闭什么原因啊

问题描述 shh框架连接Oracle数据库报流已被关闭什么原因啊 我连接MySql数据库是工作流正常的,改成Oracle数据库后第一次初始化时没报错的,再启动就出现以下问题了!哪位大侠帮帮看看的!谢谢的! Hibernate: select resources0_.DEPLOYMENT_ as DEPLOYMENT4_12_1_, resources0_.DBID_ as DBID1_1_, resources0_.NAME_ as NAME5_1_, resources0_.DBID_ as

使用sqoop将oracle数据库导入hive、hbase或hdfs时,报Error,是什么原因?

问题描述 使用sqoop将oracle数据库导入hive.hbase或hdfs时,有时候会报Error:java.lang.RuntimeException:java.lang.RuntimeException:java.sql.SQLException:Ioexception:TheNetworkAdaptercouldnotestablishtheconnection.这是什么原因?(oracle->hive时:同样的语句有时候会报错,有时候不会:oracle->hbase时每次都报错,数

不要让临时表空间影响Oracle数据库性能

在Oracle数据库中进行排序.分组汇总.索引等到作时,会产生很多的临时数据.如有一张员工信息表,数据库中是安装记录建立的时间来保存的.如果用户查询时,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据.对于这些临时数据,Oracle数据库是如何处理的呢? 通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区)内.在这个程序全局区中有一个叫做排序区的地方,专门用来存放这些因为排序操作而产生的临时数据.但是这个分区的容量是有限的.当这个

Oracle数据库日常维护手册

  在Oracle数据库运行期间,DBA应该对数据库的运行日志及表空间的使用情况进行监控,及早发现数据库中存在的问题. 一.Oracle警告日志文件监控 Oracle在运行过程中,会在警告日志文件(alert_SID.log)中记录数据库的一些运行情况: ●数据库的启动.关闭,启动时的非缺省参数; ●数据库的重做日志切换情况,记录每次切换的时间,及如果因为检查点(checkpoint)操作没有执行完成造成不能切换,会记录不能切换的原因; ●对数据库进行的某些操作,如创建或删除表空间.增加数据文件

对Oracle数据库性能优化技术的研究

大型关系数据库Oracle已经广泛应用于各行各业,如政府.交通.公安.电信.金融.能源等部门,并已逐渐成为企业信息化建设的重要数据库平台,但随着 Oracle 数据库规模的扩大,数据库用户人数的增加,数据库性能问题越来越突出,因此,有必要对 Oracle 数据库性能进行调整与优化, 使之在满足需求条件下,系统性能达到最佳和系统开销最小. 1.性能优化目标 1.1 缩短响应时间 响应时间是指从用户提交SQL语句到数据库返回结果集的第一行数据所需要的时间,缩短响应时间可以通过减小系统服务时间或用户等

ORACLE数据库日常维护知识点总结_oracle

首先要说的是,不同版本数据库提供的系统表会有不同,你可以根据数据字典查看该版本数据库所提供的表 like this: select * from dict where table_name like '%SESSION% '; 就可以查出一些表,然后根据这些表就可以获得会话信息. 像这样就是 查询当前正在操作的会话: SELECT SID, SERIAL#, STATUS, USERNAME, SCHEMANAME, OSUSER,TERMINAL, MACHINE, PROGRAM, A.NA