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