大家普遍使用的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;
我修改后的如下:(不过不太好,请高手指点)
column fsfi format 999,99
select tablespace_name,file_id,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks)))) fsfi
from dba_free_space
where bytes4160684032
group by tablespace_name,file_id order by 1;
如果大家不信,可以新建一个表空间(有16个数据文件),测的FSFI为12.5
sqrt(max(blocks)/sum(blocks))*(100/sqrt(sqrt(count(blocks))))
设max(blocks)=x,则sum(blocks)=16x,count(blocks)=16,代入
sqrt(x/16x) *(100/sqrt(sqrt(16))=1/4*(100/2)=12.5
解释:
一、为什么要加 file_id 。是因为一个表空间有10个文件时,DBA_FREE_SPACE就有10条记录,以原来的SQL统计FSFI时,它认为是10个零碎表空间。
二、为什么要加 where bytes4160684032。是因为一个文件大于4160684032时,DBA_FREE_SPACE也什么分成多条记录。比如建一个10G的文件,DBA_FREE_SPACE中有3条记录。
[ 本帖最后由 sdy1999 于 2008-6-23 22:33 编辑 ]
|