Oracle9i为Oracle数据库引擎带来了一些令人吃惊的复杂性。它推出了许多新的内部特性,包括bitmap free lists,基于redo log的复制,动态SGA,还有一个可能是最重要的特性,可以支持多种块大小(Block Size)。
当你忽略全部的高级特性时,Oracle的工作就是传送数据,磁盘的I/O管理和调整对于任何的Oracle数据库都是一个重要的部分。任何可以令磁盘I/O减少的工作都对Oracle数据库系统有一个正面的影响。
如果我们查看一下各种各样调整Oracle数据库性能的方法,就会发现其实Oracle性能调整的共同目标都是减少磁盘的I/O。例如,调整一个SQL语句以除去一个全表搜索的操作可以令查询运行得更快,因为这样可以直接地减少需要由磁盘上读取的数据块。调整实例的参数,例如DB_CACHE_SIZE也可以减少磁盘的开销。
要理解怎样使用多种块大小来提升Oracle数据库的性能,我们首先查看一下磁盘I/O的基本特性。任何时候由磁盘上访问一个Oracle数据块时,我们通常会见到三种延迟。第一种也是最重要的延迟来源于读-写头的移动时间。这个时间是指读-写头需要将自己定位到正确的柱面所需要的时间。还有选择延迟的时间,这是读-写头等待相应的块出现在它的下面,第三个延迟来源于将数据由磁盘传回到Oracle SGA。
其实99%的延迟都是在真正访问实际数据块前发生的,那么我们就可以知道读取一个32K的块所需要的时间其实和读取一个2K大小的块相差不大。也就是说,磁盘的延迟时间都是差不多的,它和块的大小无关。因此我们可以得出这样的结论:如果每次I/O都能够读取最大的块,那么Oracle数据库所需要的整体I/O就会变少。
缓冲的原理并不是Oracle数据库特有的。对于内存的访问是以纳秒计算的,而对磁盘的访问通常是用毫秒计算的。如果我们可以将Oracle的数据块都放入磁盘的缓冲中,性能将有着很大的提升。随着Oracle的成熟和内存变得越来越便宜,我们将会发现Oracle数据库的系统全局空间(SGA)的大小通常都超过10GB。这样对于Oracle数据库的性能有着很大的提升,因为在读取时,Oracle数据块都处在内存中,相对于需要由磁盘上得到数据块,这样将会快成千上万倍。
内存缓冲中保留着Oracle访问过的数据块,在缓冲中的数据读取速度要比由磁盘中读取要快14,000倍。内存数据缓冲已经由Oracle7的单一缓冲发展为Oracle8i中的三个数据缓冲。它们的名字分别是KEEP pool,RECYCLE pool和 DEFAULT pool(如图1所示)。
****************图一***************
Oracle数据缓冲
在Oracle9i中我们仍然有三个数据缓冲,不过我们还可以为Oracle服务器支持的每个块大小创建一个数据缓冲(如图2所示)。
************图2-Oracle9i的8个数据缓冲*******
在每个数据缓冲中,由数据缓冲的命中率可以知道一个数据块处在内存中的可能性。在数据缓冲间分配内存页以确保内存缓冲的最优利用是Oracle管理员的工作。有时通过增加一些缓冲就有明显的效果(见图3)
************图三***************
(增加到一个小的数据缓冲的内存页)
随着内存缓冲的增加,增加页面带来的好处就会下降(如图4所示)。
**************图4***************
在大的数据缓冲下,由此而带来的好处下降
索引和大的数据块
在Oracle9i前,Oracle的专家发现通过将整个数据库移植到更大的数据块,可以减少磁盘的I/O,从而令整个系统的性能得到提升。由表面看来这有点不符合常理,人们可能会问"如果我只需要一个80字节的行,那么读取16K的块又有什么好处呢?"
这个问题的答案和索引有关。大部分经过很好地调优的Oracle数据库都拥有和表数据差不多大小的索引。对于索引来说,大的数据块无疑可以减少I/O,从而可以提升整个数据库的性能。
所以,Oracle9i数据库管理员要做的第一件事可能就是创建一个32K的表空间,一个相应的32K大小的数据缓冲,然后将他们系统中的全部索引移植到这个32K的表空间中。通过这样,Oracle9i数据库就可以在一次磁盘I/O中读取相当数量的索引节点分枝,因此可以减轻系统的压力并且提高总体的性能。
本文地址:http://com.8s8s.com/it/it19117.htm