三、自由范畴的碎片计算
因为自由空间碎片是由几一部分构成,如范畴数量、最大范围尺码等,我们可用FSFI——Free Space Fragmentation Index (自由空间碎片目录)值来直观反映:
FSFI=100*SQRT(max(extent)/sum(extents))*一/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 一;
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 的表空间中,很少会碰见有效自由空间的问题。应一个空间快要切近可比参数时,就需要做碎片收拾了。
四、自由范畴的碎片拾掇
表空间的pctincrease 值为非 零
可以将表空间的缺省储存参数pctincrease 改成非 零 。正常将其设为 一 ,如:
alter tablespace temp
default storage(pctincrease 一);
这么SMON 便会将自由范畴自动归拢。也可以手工归拢自由范畴:
alter tablespace temp coalesce;
五、段的碎片拾掇
我们晓得,段由范畴结成。在有点情况下,有必要对段的碎片开展拾掇。要查看段的相关信息,可查看数据字典dba_segments ,范畴的信息可查看数据字典dba_extents 。
查询数据段
select segment_name,tablespace_name,bytes,blocks from USER_EXTENTS;
查询目录段
select index_name,table_owner,table_name,tablespace_name from USER_EXTENTS;
经过dba_segments查看段的信息
select tablespacee_name,count(*) nobjects,round(sum(bytes)/1024/1204/1024.2) GB,sum(blocks),sum(extents) from
dba_segments group by rollup(tablespace_name);
如若段的碎片过剩,将其数据压缩到一个范畴的最简略步骤乃是用准确的储存参数将这个段重建,其后将旧表中的数据安插到新表,与此同时剔除旧表。这个进程可以用Import/Export (输入/ 输出)工具来完成。
Export ()下令有一个(压缩)标示,这个标示在读表时会挑动Export 确定该表所分配的物理空间量,它会向输出转储资料写下一个新的初始化储存参数—— 即是所有所分配空间。若这个表封闭, 则施用Import ()工具从新生成。这么,它的数据会放入一个新的、较大的初始段中。比如:
exp user/passWord file=exp.dmp comPRess=Y grants=Y indexes=Y
tables=(table一,table二);
若输出顺利,则从库中剔除已输出的表,其后从输出转储资料中输入表:
imp user/password file=exp.dmp commit=Y buffer=64000 full=Y