大家普遍使用的计算fsfi的SQL是错误的。我修改如下:

[复制链接]
查看11 | 回复4 | 2005-2-28 12:57:00 | 显示全部楼层 |阅读模式
大家普遍使用的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 编辑 ]
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
不好意思。刚才去打球去了。
如果不按照FILE统计,新建一个表空间(如果有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统计。因为一个表空间有10个数据文件时,DBA_FREE_SPACE就有10条记录,以原来的SQL统计FSFI时,它认为是10个零碎表空间。
二、为什么要加where bytes4160684032。是因为一个数据文件大于4160684032时,DBA_FREE_SPACE也什么分成多条记录。比如建一个10G的文件,DBA_FREE_SPACE中有3条记录。
[ 本帖最后由 sdy1999 于 2008-6-23 22:30 编辑 ]
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
都lmt 了,算这个还有什么意思呢
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
原帖由 biti_rainy 于 2008-6-23 22:50 发表
都lmt 了,算这个还有什么意思呢



楼主发这个fsfi我记得发好几次了
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
原帖由 biti_rainy 于 2008-6-23 22:50 发表
都lmt 了,算这个还有什么意思呢

谢了.
我单位新上了一个广通的"运行维护"系统,它老是提示我 FSFI太小,经过网上查询,发现大家给都是通过以上的SQL脚本计算FSFI,分析了一下,感觉有问题,经biti_rainy一说,确实感觉再计算FSFI就没有意义.明天联系广通把这个FSFI提示去掉.
再次感谢.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行