`

必须引起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.DBA手记_数据库诊断案例与性能优化实践].《Oracle.DBA手记》编委会.扫描版

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

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

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

    ORACLE 碎片整理

    Oracle作爲一種大型資料庫,廣泛應用於金融、郵電、電力、民航等資料吞吐量巨大,電腦網路廣泛普及...作爲影響資料庫性能的一大因素--資料庫碎片,應當引起DBA的足夠重視,及時發現並整理碎片乃是DBA一項基本維護內容。

    oracle数据库dba管理手册

    第一部分 数据库体系结构 第1章 Oracle体系结构 1 1.1 数据库概述及实例 1 1.2 数据库 1 1.2.1 表空间 2 1.2.2 文件 2 1.3 实例 3 1.4 数据库内部结构 3 1.4.1 表、列和数据类型 4 1.4.2 约束条件 5 1.4.3 抽象数据...

    Oracle数据库管理员技术指南

    4.10 为什么必须保护 ORACLE_HOME 4.11 保护操作系统 4.12 如何保护回退段 4.13 分类和划分数据 4.14 划分表空间的优先次序 4.15 如何配置高可用性的 TEMP 表空间 4.16 确保在归档日志目标位置有足够的 可用...

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

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

    《Oracle DBA手记——数据库诊断案例与性能优化实践》第一章 to be continued

    │ 05.Oracle数据库无响应故障的处理 │ 06.RAC环境诊断案例一则 ├─第三篇 SQL调优篇 │ 01.合理利用索引解决性能问题 │ 02.SQL优化与调整实践 │ 03.索引访问与数据读取 │ 04.SQL优化之Everything is possible ...

    Oracle.DBA手记_数据库诊断案例与性能优化实践

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

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

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

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

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

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

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

    oracle DBA 的职责

    ORACLE数据库管理员应按如下方式对ORACLE数据库系统做定期监控: (1). 每天对ORACLE数据库的运行状态,日志文件,备份情况,数据 库的空间使用情况,系统资源的使用情况进行检查,发现并解决问题。 (2). 每周对数据库...

    ORACLE DBA的职责.doc

    ORACLE数据库管理员应按如下方式对ORACLE数据库系统做定期监控:  (1). 每天对ORACLE数据库的运行状态,日志文件,备份情况,数据  库的空间使用情况,系统资源的使用情况进行检查,发现并解决  问题。  (2). 每周对...

    Oracle_DBA手记1-数据库诊断案例与性能优化实践

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

    《Oracle DBA手记》试读样章下载

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

    Oracle DBA 参考手册

    2.2.1. ORACLE数据库管理员应按如下方式对ORACLE数据库系统做定期监控: 19 2.2.2. 每天的工作 20 2.2.3. 每周的工作 21 2.2.4. 每月的工作 22 DBA例行工作 22 2.3. 开发 DBA 工作 24 3. 操作系统和服务器硬件 25 ...

    《Oracle DBA手记》

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

Global site tag (gtag.js) - Google Analytics