草样年华 » 日志 » ORACLE表空间区自动分配时的扩展策略初步研究
ORACLE表空间区自动分配时的扩展策略初步研究
andzen 发表于 2005-12-30 14:14:48
ORACLE 8i开始引入了新的表空间管理方式,本地管理表空间,相比以前的数据字典管理区信息,有效的解决了区分布的数据字典争用引起的性能问题.与此同时老版本对于规模特别大的表的区管理的存在的问题,引入了区自动管理策略,使得以前版本存在的区碎片太多的问题得到有效的解决,ORACLE本地管理表空间的"区管理"模式有两种:自动管理和统一分配;对于两种模式各有用途,现概描述如下.
统一分配的时候每个EXTENT(区)的BLOCK个数是固定的,有表空间创建时候指定,对于表空间上的每个段都遵守该规则,创建表的时候不理会create table 时指定新的扩展参数.例如一个BLOCK大小为8K的系统,区统一分配大小为128K,此时SEGMENT(段)空间的扩展规律就是平均增长,每扩展一个区的时候大小均为128K,相当于16个BLOCK,这种扩展策略有利于表不是特别大的情况,很有效的防止SEGMENT里面会有大批的空白空间,最多的浪费不超过一个EXTENT的大小,但是对于VLDB某些非常大的表则会可能产生EXTENT过多的问题,例如一个表大小为2G(2000M),对于某些TB级别大型的信息系统,甚至20G,100G大小的表,如果按128K每个区大小,则会有16000个区产生,如此多的区,无疑给ORACLE的空间管理带来很大的的考验,如果增大每个区大小为1024K,此时仍将会有2000个EXTENT,当我们没有办法确切知道系统的表会有多大的时候,此时好且简单的解决方案是采用区自动分配模式;
区自动分配模式时,ORACLE根据内部一套算法,来计算区的扩展策略,由于ORACLE并未公布其扩展算法的计算公式,所以此时需要我们自己去探究一下,可以肯定的是此算法一定是随着BLOCKs增加的时候,BLOCKs/EXTENTs是个增函数,所以为了大概量化估算其扩展策略,我们进行了64k--17000M范围的测试;得到如下一组数据如下,此数据是在[block size = 8k]下测试得到;
区号 区数量 空间 每区BLKs 每区空间
---------------------------------------------------------------------------------------------------
0-15 16 个 0-1M 每区 8 个BLK 64K
16-79 64 个 1-64 M 每区 128 个BLK 1M
80-199 120个 64-1024M 每区 1024 个BLK 8M
200-528 328个 1-22.8G 每区 8192 个BLK 64M
528以上 未测 未测 未测 未测
上面最大的测试表的大小为22.8G的时候,区数仅仅528,区无限扩展的问题是很好的解决了,不过此时,对数据磁盘的浪费也是非常可观的,每扩展一个区就是几十上百M;所以针对上面两种管理模式,数据库设计者应该根据每个表的规模,选用不同的区管理策略,以求性能和空间的最优化.
nanshan.sz 2005.12.30
