如何整理oralce空间
上一篇 / 下一篇 2008-06-15 20:46:47 / 个人分类:Oracle
- 文件版本: V1.0
- 开发商: 本站原创
- 文件来源: 本地
- 界面语言: 简体中文
- 授权方式: 免费
- 运行平台: Win9X/Win2000/WinXP
ORACLE碎片整理
,YF7S"E9R0
a!A4t9O'R#O0
R4F
f"q+G@z0 51Testing软件测试网)y,? O:@Zq|4a9K
1 、碎片是如何产生的 51Testing软件测试网 LTb&MM-Uv@
lK3d{\"K%^
r-t0 ---- 当生成一个数据库时,它会分成称为表空间( Tablespace )的多个逻辑段( Segment ),如系统( System )表空间 , 临时( Temporary )表空间等。一个表空间可以包含多个数据范围( Extent )和一个或多个自由范围块,即自由空间( Free Space )。
yEZu
b;n$}0 51Testing软件测试网e/@`7X~5z,`+E:Y;C
---- 表空间、段、范围、自由空间的逻辑关系如下:
d.T'Uq\}0
(}a t&F2G [u0 ---- 当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在单一的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的,如图〈 1 〉。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择), 而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。例如:
0p s+J3w
r0I/j0
'_"Ue3G0k zZ^JQ0 2 、碎片对系统的影响
5|Ad:[*Ri)k0
$j wY%p
I@0 ---- 随着时间推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,将对数据库有以下两点主要影响: 51Testing软件测试网4p w7K|$~~%kB
E)?8r5\?Vd0 ---- ( 1 )导致系统性能减弱
R2mg0Uk$o%R+e@0
3QSj EG ?HF0 ---- 如上所述,当要满足一个空间要求时,数据库将首先查找当前最大的自由范围,而 " 最大 " 自由范围逐渐变小,要找到一个足够大的自由范围已变得越来越困难,从而导致表空间中的速度障碍,使数据库的空间分配愈发远离理想状态;
6UDa*hy;zz8n*P0 51Testing软件测试网}e]TD
---- ( 2 )浪费大量的表空间
.x/f+Vfr0H6X%J0
LX{b1gm6b `qo0 ---- 尽管有一部分自由范围(如表空间的 pctincrease 为非 0 )将会被 SMON (系统监控)后台进程周期性地合并,但始终有一部分自由范围无法得以自动合并,浪费了大量的表空间。
]Xg,a9pV-bD0
XnA"v2SA~
ba0 3 、自由范围的碎片计算
"[I} n3faN}s0
]"l#^"B j3wW6C)v}I0 ---- 由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用 FSFI--Free Space Fragmentation Index (自由空间碎片索引)值来直观体现: 51Testing软件测试网l/F!L+FAi
51Testing软件测试网I.^?(L8Y:VUc
FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents)))
*cvQw#pa0
uo#@-MFX)C0 ---- 可以看出, FSFI 的最大可能值为 100 (一个理想的单文件表空间)。随着范围的增加, FSFI 值缓慢下降,而随着最大范围尺寸的减少, FSFI 值会迅速下降。
%Ex z a?(A/~0C.t0 51Testing软件测试网5Z(s1a~li,nH
---- 下面的脚本可以用来计算 FSFI 值: 51Testing软件测试网2J#WolM-K&g+a4n+c
%oOa nZ$bk&E9S0 rem FSFI Value Compute 51Testing软件测试网zCC:G/E_Qn
51Testing软件测试网/M3[L(]x&C&[
rem fsfi.sql 51Testing软件测试网-w%G1VVSp:A*\u$@
eX)sq[f,Sm0 column FSFI format 999,99
(}1MK&\*D ~0
Qip bt1V8H"W0 select tablespace_name,sqrt(max(blocks)/sum(blocks))* 51Testing软件测试网z
a8l2P"J
51Testing软件测试网CY1]3K`L3z.F
(100/sqrt(sqrt(count(blocks)))) FSFI 51Testing软件测试网O4Hd&_k\K
)EA;v'Cl'j0 from dba_free_space 51Testing软件测试网8[4h.^)^Q b-Z
'_M4U7[+lz0 group by tablespace_name order by 1;
RiQ YE*L*n*{9}9vG0
,bfnrsO uV+bxr0 spool fsfi.rep;