Oracle数据库中利用ASSM改善分段存储
2007-05-09 12:14:19 来源:WEB开发网数据行在刚保存的时候还很小,而在后来进行了扩展,在这种情况下,PCTFREE的设置就显得尤其重要了。在这样的系统里,通常会把PCTFREE设置成等于95,这就告诉Oracle要为数据行今后的扩展保留95%的数据区段空间。
PCTUSED的问题
对PCTUSED不正确的设置(例如设得太小了)会导致SQL插入声明性能的急剧下降。如果数据区块剩余空间不是很多,那么在SQL插入操作的过程中就会产生过量的I/O,这是因为被重新使用的Oracle数据区块会被迅速地填满。从极端的角度来看,没有正确地设置PCTUSED会导致数据区块的剩余空间要比表格数据行的平均长度小。在这样的情况下,Oracle会五次尝试从freelist链取回区块。在五次尝试以后,Oracle会提升表格的水位,并为插入操作腾出五个新的数据块。
有了Oracle9i的ASSM,PCTUSED就不再控制表格数据块的重新链接阙值了,但是你必须依靠Oracle的判断来确定区块在什么时候会有足够的剩余空间放置到freelist里。
尽管有了本地管理的tablespace和ASSM之后Oracle9i会忽略PCTUSED、FREELISTS和FREELIST GROUPS等参数,但是当它们用于表格定义的时候,Oracle还是不会给出错误信息: SQL> create table
2 test_table
3 (c1 number)
4 tablespace
5 asm_test
6 pctfree 20 pctused 30
7 storage
8 ( freelists 23 next 5m ) ;
Table created.
如果你不记得带有ASSM的本地管理tablespace会略掉任何为PCTUSED、NEXT和FREELISTS所指定的值的话,这将是一个十分严重的问题。
使用ASSM的一个巨大优势是,位图freelist肯定能够减轻缓冲区忙等待(buffer busy wait)的负担,这个问题在Oracle9i以前的版本里曾是一个严重的问题。现在让我们来仔细看看这个特性。
在没有多个freelist的时候,每个Oracle表格和索引在表格的头部都曾有一个数据块,用来管理对象所使用的剩余区块,并为任何SQL插入声明所创建的新数据行提供数据块。当数据缓冲内的数据块由于被另一个DML事务处理锁定而无法使用的时候,缓冲区忙等待就会发生。当你需要将多个任务插入到同一个表格里的时候,这些任务就被强制等待,而同时Oracle会在同时分派剩余的区块,一次一个。
有了ASSM之后,Oracle宣称显著地提高了DML并发操作的性能,因为(同一个)位图的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。根据Oracle的测试结果,使用位图freelist会消除所有分段头部(对资源)的争夺,还能获得超快的并发插入操作(图A)。
图A Oracle公司对使用位图freelist进行SQL插入操作的测试结果
ASSM的局限性
尽管ASSM显示出了令人激动的特性并能够简化Oracle DBA的工作,但是Oracle9i的位图分段管理还是有一些局限性的:
一旦DBA被分配之后,它就无法控制tablespace内部的独立表格和索引的存储行为。
大型对象不能够使用ASSM,而且必须为包含有LOB数据类型的表格创建分离的tablespace。
你不能够使用ASSM创建临时的tablespace。这是由排序时临时分段的短暂特性所决定的。
只有本地管理的tablespace才能够使用位图分段管理。
使用超高容量的DML(例如INSERT、UPDATE和DELETE等)的时候可能会出现性能上的问题。
更多精彩
赞助商链接