众所周知,oracle作为一种大型数据库,广泛应用于金融、邮电、电力、民航等重要部门,具有巨大的数据吞吐量和广泛的计算机网络。对于系统管理员来说,如何保证网络的稳定运行,如何提高数据库的性能,
让它更安全、更高效尤为重要。数据库碎片作为影响数据库性能的主要因素,应该引起dba足够的重视,及时发现和整理碎片是dba的一项基本维护内容。
-1.碎片是如何产生的?
-当数据库生成时,它将被分成几个称为表空间的逻辑段,如系统表空间和临时表空间。
一个表空间可以包含多个数据区和一个或多个自由范围块,即自由空间。
-表空间、段、范围和空闲空间之间的逻辑关系如下:
-在表空间中生成段时,将从表空间的有效空闲空间中为该段的初始范围分配空间。当这些初始范围充满数据时,该段将请求添加另一个范围。这个扩展过程将继续,直到达到最大范围值。
或者下一个范围的表空间中没有空闲空间。理想状态是一个段的数据可以存储在单个范围内。这样,所有数据都存储在靠近段中其他数据的位置,并且可以少用一些指针来查找数据。
然而,在很多情况下,一个段包含多个范围,并且没有措施来确保这些范围被相邻地存储,如图1所示。当要满足空间要求时,数据库不再合并相邻的空闲区域(除非没有其他选择)。
相反,要找到表空间中最大的可用范围来使用。这样就会逐渐形成越来越多的离散的、分离的、更小的自由空间,也就是碎片。例如:
-2.碎片对系统的影响
-随着时间的推移,基于数据库的应用系统的广泛使用将产生越来越多的碎片,这些碎片将对数据库产生以下两个主要影响:
-(1)导致系统性能的减弱。
-如上所述,当要满足一个空间需求时,数据库会首先寻找当前的最大自由范围,而‘最大’自由范围越来越小,找到一个足够大的自由范围变得越来越困难,这就导致了表空间中的速度障碍。
使数据库的空间分配远离理想状态;
——(2)浪费了大量的表空间。
-虽然有些空闲范围(比如某个表空间的pctincrease为非0)会被smon(系统监控)的后台进程定期合并,但有些空闲范围始终无法自动合并,浪费了大量的表空间。
-3、碎片自由范围计算
-由于自由空间碎片是由范围数和最大范围大小等几部分组成的,我们可以用FSFI-自由空间碎片指数的值来直观地反映:
fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))
-可以看出,fsfi的最大可能值是100(理想的单文件表空间)。随着范围的增大,fsfi值缓慢下降,而随着最大范围大小的减小,fsfi值迅速下降。
-以下脚本可用于计算fsfi值:
remfsfivaluecompute
remfsfi.sql
columnfsfiformat999,99
selecttablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks))))fsfi
fromdba_free_space
groupbytablespace_nameorderby1;
spoolfsfi.rep;
/
spooloff;
-例如,在数据库中运行脚本fsfi.sql,并获得以下fsfi值:
tablespace_namefsfi
-------------------------------------
rbs74.06
system100.00
temp22.82
tools75.79
users100.00
user_tools100.00
ydcx_data47.34
ydcx_idx57.19
ydjf_data33.80
ydjf_idx75.55
-如果将数据库的fsfi值计算在内,则可以将其用作可比参数。在有效空闲空间足够多,fsfi值超过30的表空间中,很少遇到有效空闲空间的问题。当空间即将接近可比参数时,
你需要整理一下。
-4、自由范围的碎片分类
-(1)表空间的pctincrease值为非0。
----可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如:
altertablespacetemp
defaultstorage(pctincrease1);
----这样smon便会将自由范围自动合并。也可以手工合并自由范围:
altertablespacetempcoalesce;
----5、段的碎片整理
----我们知道,段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典dba_segments,范围的信息可查看数据字典dba_extents。如果段的碎片过多,
将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用import/export(输入/输出)工具来完成。
----export()命令有一个(压缩)标志,这个标志在读表时会引发export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数-- 等于全部所分配空间。若这个表关闭,
则使用import()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:
expuser/passwordfile=exp.dmpcompress=ygrants=yindexes=y
tables=(table1,table2);
----若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:
impuser/passwordfile=exp.dmpcommit=ybuffer=64000full=y
----这种方法可用于整个数据库。
----以上简单分