`

必须引起DBA重视的Oracle数据库碎片

阅读更多

目前,Oracle已经广泛的应用于各个行业。作为一名DBA,及时发现并整理碎片已经成为DBA日常工作中的一项重要维护内容。

 

1、碎片是如何产生的

 

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

 

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

 

当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在单一的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的,如图〈1〉。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择), 而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。

 

2、碎片对系统的影响

 

随着时间推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,将对数据库有以下两点主要影响:

 

(1)导致系统性能减弱

 

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

 

(2)浪费大量的表空间

 

尽管有一部分自由范围(如表空间的pctincrease为非0)将会被smon(系统监控)后台进程周期性地合并,但始终有一部分自由范围无法得以自动合并,浪费了大量的表空间。

 

3、自由范围的碎片计算

 

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

 

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

 

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

 

下面的脚本可以用来计算fsfi值:

 

rem fsfi value compute

 

rem fsfi.sql

 

column fsfi format 999,99

 

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;

 

spool fsfi.rep;

 

/

 

spool off;


 

 

 

比如,在某数据库运行脚本fsfi.sql,得到以下fsfi值:

 

tablespace_name fsfi

 

-- ---

 

rbs 74.06

 

system 100.00

 

temp 22.82

 

tools 75.79

 

users 100.00

 

user_tools 100.00

 

ydcx_data 47.34

 

ydcx_idx 57.19

 

ydjf_data 33.80

 

ydjf_idx 75.55

 

统计出了数据库的fsfi值,就可以把它作为一个可比参数。在一个有着足够有效自由空间,且fsfi值超过30的表空间中,很少会遇见有效自由空间的问题。当一个空间将要接近可比参数时,就需要做碎片整理了。

4、自由范围的碎片整理

 

(1)表空间的pctincrease值为非0

 

可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如:

 

alter tablespace temp

 

default storage(pctincrease 1);

 

这样smon便会将自由范围自动合并。也可以手工合并自由范围:

 

alter tablespace temp coalesce;

 

5、段的碎片整理

 

我们知道,段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典dba_segments,范围的信息可查看数据字典dba_extents。如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用import/export(输入/输出)工具来完成。

 

export()命令有一个(压缩)标志,这个标志在读表时会引发export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数--等于全部所分配空间。若这个表关闭, 则使用import()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:

 

exp user/password file=exp.dmp compress=y grants=y indexes=y

 

tables=(table1,table2);

 

若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:

 

imp user/password file=exp.dmp commit=y buffer=64000 full=y

 

注:此方法可以用于整个数据库。

分享到:
评论

相关推荐

    Oracle数据库碎片整理

    Oracle数据库碎片整理是数据库管理员(DBA)的一项基本维护内容。数据库碎片是影响数据库性能的一大因素,碎片的产生是由于表空间中的自由空间被分割成多个小的自由范围块,导致数据存储不连续、寻找数据困难,从而...

    Oracle数据库碎片如何整理

    "Oracle数据库碎片如何整理" Oracle数据库碎片是指在数据库中由于表空间、段、范围、自由空间的逻辑关系导致的碎片问题,会对系统性能和表空间造成影响。这种碎片问题可以通过计算FSFI值来检测,高于30的FSFI值表示...

    Oracle数据库整理表碎片

    ### Oracle数据库整理表碎片 #### 表碎片的来源与影响 在Oracle数据库中,随着对表数据的频繁增删改查操作,特别是大量的删除操作,会导致表产生所谓的“碎片”。这是因为,当执行删除操作后,虽然原数据所占用的...

    Oracle数据库碎片整理.pdf

    【Oracle数据库碎片整理】 Oracle数据库在长期运行过程中,由于数据的增删改操作,往往会产生大量的碎片,这不仅会降低数据库的性能,还可能导致空间浪费。碎片主要分为两种类型:内部碎片(Internal Fragmentation...

    oracle数据库从入门到精通.pdf

    Oracle数据库是业界广泛使用的大型关系型数据库系统,它以强大的功能、高性能和稳定性著称。文档《oracle数据库从入门到精通.pdf》详细地介绍了Oracle数据库的基础知识和高级操作,使得学习者能够从基础的表空间创建...

    浅谈Oracle数据库的碎片整理.pdf

    "浅谈Oracle数据库的碎片整理" 在 Oracle 数据库中,碎片整理是一个非常重要的维护内容。随着时间的推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,对数据库性能产生严重的影响。 碎片的产生是由于...

    [Oracle.DBA手记_数据库诊断案例与性能优化实践].《Oracle.DBA手记》编委会.扫描版

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及oracle典型错误的分析和诊断,各种sql优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    oracle dba数据库日常维护完全手册

    Oracle DBA 数据库日常维护完全手册 本文档为 Oracle 数据库管理员(DBA)提供了日常维护的完全手册,涵盖了数据库日常维护的重要知识点,包括 Oracle 警告日志文件监控、数据库表空间使用情况监控、查看数据库的...

    Oracle数据库DBA专题技术

    Oracle数据库DBA专题技术是IT领域中一个至关重要的主题,尤其对于那些负责管理和维护Oracle数据库系统的数据库管理员(DBA)而言。盖国强,作为Oracle领域的知名专家,他的著作《Oracle数据库DBA专题技术精粹》是这...

    Oracle数据库DBA神器

    ### Oracle数据库DBA神器 #### Oracle数据库日常维护脚本大全汇总_DBA必备神器 在现代企业环境中,Oracle数据库因其稳定性、安全性和强大的功能而被广泛采用。为了更好地管理和维护Oracle数据库,DBA(数据库管理...

    Oracle碎片整理全面解析

    #### 二、Oracle数据库碎片化原理 在Oracle数据库中,数据存储在不同的逻辑结构中,包括表空间(Tablespace)、段(Segment)等。随着数据库的使用,这些存储区域会发生变化,导致存储空间分配不连续,即产生了所谓的...

    ORACLE 碎片整理

    而数据库碎片则是影响性能的一个重要因素,因此及时发现并处理碎片问题成为了DBA的一项基本维护工作。 当创建一个Oracle数据库时,它会被划分为多个逻辑段,称为表空间(Tablespace),包括但不限于系统(System)表...

    Oracle_DBA手记3-数据库性能优化与内部原理解析

    Oracle数据库管理员(DBA)在维护数据库系统的稳定运行和性能方面扮演着至关重要的角色。随着数据量的不断增长和业务需求的日益复杂化,DBA面临越来越多的挑战。为了提升个人技能,对于一名合格的Oracle DBA来说,...

    Oracle DBA 手记 数据库诊断案例与性能优化实践 1/3

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及Oracle典型错误的分析和诊断,各种SQL优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    Oracle数据库面试题及答案

    知识点:DBA_FREE_SPACE 是 Oracle 数据库中的一个视图,用于判断 tablespace 的剩余空间。 23. 如何判断谁往表里增加了一条记录? 答案:auditing 知识点:auditing 是一种操作,用于记录谁往表里增加了一条记录。...

    Oracle数据库空间的使用和管理

    总之,Oracle数据库空间的使用和管理涉及多个层面,包括概念理解、规划、性能优化和碎片管理。通过深入理解这些概念并熟练掌握相关SQL语句和工具,可以有效地管理数据库空间,从而提高整体系统的性能和稳定性。

    Oracle数据库索引的维护

    ### Oracle数据库索引的维护 在Oracle数据库管理与优化的过程中,索引的维护是非常关键的一环。合理地创建、管理和优化索引能够显著提高查询性能,降低系统的响应时间,从而提升整个应用程序的效率。本文将从Oracle...

Global site tag (gtag.js) - Google Analytics