打对了

实践Oracle优化技术在医疗信息化中的深入应用,探索医院信息系统性能优化设计之道。公众号:医信系统性能优化。

 

对表的pctfree和pctused两个参数进行估算的方法

对于不同的应用系统,表的pctfree 和pctused两个参数有不同的设计原则,以下是根据特定的应用系统进行估算的例子,从中可以掌握基本的估算方法。
 
表的存储参数调整,一般情况,设置为pctfree 5 pctused 85即可(缺省为pctfree 10 pctused 40)
1.对于Pctfree参数
除了可以按字段及字段长度估算平均行长外,下面的方面可以根据已有数据分析出平均行长和每块行数
例:
analyze table 病人信息 compute statistics for table for all indexes for all indexed columns;
Select Num_Rows,Blocks,Round(Num_Rows / Blocks) Avg_Rows_Block, Avg_Row_Len From User_Tables Where Table_Name = '病人信息'

    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN    
 857291 14161 61 117 

对于一般8192的块,实际可用空间为8100左右.
假设以前该表的pctfree为15,改为5后,pctfree减少10,就可以再存入约7行.

相同的1万4千块就可以多存放约10万行数据,
这10万行数据,如果按每块60行算,就可以少占用约1700块(约13M的空间)
如果全表扫描该表的话,少读1700块数据,少106次IO操作(按缺省db_file_multiblock_read_count=16计算)
少占13M的内存

另外,需要考虑的两个因素
1。更新操作时,数据增长量大不大,例如:主要是把状态字段由1改为3,还是把摘要由空改为一段文字
2。并发事务的多少,因为一个事务信息在块中要占用约24Byte,如果有10个并发事务的话,至少额外考虑240Byte的空闲空间。

2.对于Pctused参数
主要考虑删除后插入数据的情况多不多,以及平均行长大小
例如:
病人费用记录,医保如果存在校对操作的话,是先产生预交结算数据,正式结算时,删除这些数据再重新生成
所以,病人预交记录,Pctused不能设置太高,否则重用那些低于Pctused的块,只能插入少量数据行,增加了IO操作
analyze table 病人预交记录 compute statistics for table for all indexes for all indexed columns;
Select Num_Rows,Blocks,Round(Num_Rows / Blocks) Avg_Rows_Block, Avg_Row_Len From User_Tables Where Table_Name = '病人预交记录'

    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN    
 181758 2147 85 83 

如果设置pctfree 5 pctused 85,那么当删除一些行使块的已用空间低于85%时,块会被重用,但是因为要预留5%的空闲空间,
所以,对于已用空间刚刚低于85%的块,重用空间就只有10%,对于8K的块,可用810Byte,平均行长83,可以再放入9行,所以这个参数也是可以的。

但是,如果是病人费用记录,平均行长229,这样设置,只能放下3行,这个参数就不太合适了
 
    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN    
 925133 38278 24 229 

根据分析,病人费用记录的数据更新量不大,但是并发操作比较大,最好把Pctfree设置高一点
所以,可以设置为pctfree 10 pctused 75(重用的块至少可以放5行,约1-2张单据),甚至pctused 70也是可以的。

如果一个块的数据行数太多,可能造成热块争用,但是相对于减少存储,减少IO,减少内存占用带来的好处来说,热块不是特别突出的情况下可以不考虑。

posted on 2006-11-23 17:11  知道得越多知道的越少  阅读(2372)  评论(2编辑  收藏  举报

导航