ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在Oracle9i中使用多种Block Size (转)

在Oracle9i中使用多种Block Size (转)

原创 Linux操作系统 作者:jcszjswkzhou 时间:2019-02-28 08:54:05 0 删除 编辑
在Oracle9i中使用多种Block Size,sql,sql教程,Oracle基础

  Oracle9i为Oracle数据库引擎带来了一些令人吃惊的复杂性它推出了许多新的内部特性包括bitmap free lists基于redo log的复制动态SGA还有一个可能是最重要的特性可以支持多种块大?a href="http://www.learners.cn" target="_blank">。˙lock 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中读取相当数量的索引节点分枝因此可以减轻系统的压力并且提高总体的性能

  将对象分配到多个块缓冲中  通过这种方式我们就可以在Oracle数据库创建多个数据缓冲那么我们怎样决定放些什么数据到这些数据缓冲中呢?  让我们先来看一些更常见的技巧  隔离大表的全表搜索--对于要进行全表搜索的大表将会从最大的块大小中得益它们应该被放在使用最大块大小的表空间  仔细设置db_recycle_cache_size--如果你没有为服务器设置db_cache_size到支持的最大块大小你将不应该使用db_recycle_cache_size参数代替的是你将要创建一个db_32k_cache_size(或者是你设置的最大值)并且将那些经常需要进行全表搜索的大表分配到最大的缓存中  数据字典(Data Dictionary)使用默认的缓冲--你应该确保数据字典(例如你的SYSTEM表空间)经常全部缓冲到一个数据缓冲池中要记住确保SYSTEM表空间的数据缓冲拥有足够的内存来缓冲全部的数据字典块要比数据字典的块大小重要  隔离索引--在许多情况下Oracle的SQL语句将会通过一个索引范围搜索来得到索引的信息根据SQL语句的条件通过b树或者bitmap索引来搜索一定范围的值因此将尽量多的索引放到内存中是有好处的Oracle 9i数据库管理员首先要做的其中一件事情就是将他们全部的Oracle索引转移到一个使用大的数据块的表空间中索引性能将会由大的块中得到好处  隔离随机访问读取--对于那些由磁盘中随机读取很少行数的数据库来说Oracle DBA可以移动这些类型的表到一个2K的表空间中我们要记住虽然磁盘已经越来越便宜但是这样做会读取一些与查询无关的内容到内存中这是我们不希望看到的因此对于小的、随机访问的表Oracle DBA通常使用小的块大小  隔离LOB列的表--对于那些包含有raw, long raw或者in-line LOBs的表将它们移动到大的数据块中将会极大地提升磁盘I/O的性能有经验的DBA将会检查dba_tables.avg_row_len来确保块大小要比平均的行大这样将可以减少Row chaining的发生同时整个LOB都可以在一次磁盘I/O中读取避免了Oracle必须读取多个块而带来的开销  隔离全表搜索的大表--在Oracle8i中首次推出recycle pool它的想法是全表搜索的数据块通常都不会被其它事务重新读?a href="http://www.learners.cn" target="_blank">。?a href="http://www.learners.cn" target="_blank">,从而可以将它们快速地由Oracle SGA中清除这样就可以将宝贵的内存用在那些有更大机会被其它事务重新读取的数据块上在Oracle9i中你可以设置recycle pool使用一个更小的块大小  检查平均的行长--表空间的块大小要比其中表的平均行长要大(dba_tables.avg_row_len)如果它比平均行长小这时就会发生rows chaining和过多的磁盘I/O  使用大的块作数据排序--你的TEMP表空间将会由最大支持的块中受益这样磁盘排序句可以发生在大的块中从而减少磁盘I/O  查看数据缓冲使用情况的工具  将Oracle对象放到独立的数据缓冲中的过程是很简单的Oracle9i还提供了一些工具作辅助许多Oracle的管理员都没有意识到这些处于数据缓冲中的块消耗一个不对称的数据空间,而Oracle9i提供了大量的脚本来让你查看哪些对象是经常处在数据缓冲中的  以下的查询是用来计算当前缓冲中的全部segment的块数目根据你的缓冲大小这样或者需要很多排序空间column object_name format a40column number_of_blocks format 999,999,999,999column object_name format a40column number_of_blocks format 999,999,999,999SELECT  o.object_name,  COUNT(1) number_of_blocksFROM  DBA_OBJECTS o,  V$BH bhWHERE  o.object_id = bh.objdAND  o.owner != 'SYS'GROUP BY  o.object_nameORDER BY  count(1) desc;  以下让我们看一下缓冲中的对象名和数据块的数目OBJECT_NAME  NUMBER_OF_BLOCKS---------------------------------------- ----------------ORDER_TABLE   123,273ORDER_IDX    112,492CUSTOMER     83,272. . . OEM_EXT       701   创建独立的数据缓冲  在Oracle9i中将表或者索引块分配到不同数据块大小的表空间是很简单的在创建一个表空间时我们会使用一个新的blocksize参数在以下的例子中我们在Oracle数据库中创建了一个32K的表空间create tablespace 32k_tablespacedatafile '/u01/oradata/mysid/32k_file.dbf'size 100Mblocksize  32k;  我们一旦创建了表空间下一步是根据上面的blocksize来设置一个数据库缓冲要记住Oracle 9i不再使用init.ora文件所以我们要通过alter database语句来动态地创建带名字的缓冲alter system set db_2k_cache_size=200M; alter system set db_4k_cache_size=500M; alter system set db_8k_cache_size=800M; alter system set db_16k_cache_size=1600M;   一旦我们创建了带名字的内存缓冲和表空间我们就可以将Oracle对象转移到新的表空间中对于将对象由一个表空间转移到另一个有多种方法而许多的Oracle管理员已经习惯使用create table as select or CTAS语法来移动表格对于index则可以使用alter index rebuild转移到另一个表空间  结论  对于Oracle9i的许多新特性许多有经验的DBA都认为块的大小对于调整Oracle数据库是最重要的管理员现在可以使用多达7个独立和不同的数据池可以对每个数据对象使用的数据缓冲块的数目进行更大的控制通过考察不同的缓冲访问特性可以大大地减少磁盘I/O从而极大地提高数据库的性能

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-122163/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-08-29

  • 博文量
    901
  • 访问量
    568483