ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 10.2版本以上对db_file_multiblock_read_count变化分析

10.2版本以上对db_file_multiblock_read_count变化分析

原创 Linux操作系统 作者:yezhibin 时间:2010-03-25 16:34:45 0 删除 编辑
       在oracle 10.2版本以上,oracle建议在参数文件中不设置db_file_multiblock_ read_count值或设置为0,同时又引进了两个隐含:_db_file_optimizer_read_ count 和 _db_ file_ exec_read_count,以下是对该隐含参数进行分析:

一、机制分析
    
       我们知道db_file_multiblock_read_count 在CBO在计算表扫描中是一个比较重要因子, 其计算公式如下:
    
      cost=1+HWM/k

传统方法存在问题:

1、如果提高db_file_multiblock_read_count值,对应K相应提高,从而cost值降低,导致优化器选择全表扫描的机率增加,但很多时候,采用索引方式有更好的执行计划;

 2、如果降低db_file_multiblock_read_count值,cost计算值增加,提高了执行计划中采用索引的机率,但如果执行计划选择了全表扫描,因为db_file_multiblock_ read_count值太小,导致执行时候I/O效率太低。

  基于上述分析,10.2版本以上引进了_db_file_optimizer_read_ count 和_db_ file_ exec_read_ count解决了所遇到瓶颈:

1、_db_file_optimizer_read_ count 该值为较低值,缺省值为8,用于计算成本,增加执行计划使用索引的机率;

2、_db_ file_ exec_read_count值较大,在执行过程中一旦选择全表扫描时候,提高I/O吞吐能力

    如果在10.2版本以上设置db_file_multiblock_read_count参数,将导致隐含参数失效。具体将在试验中进行验证。

二、实验测试

1、创建测试表
SQL>execute dbms_random.seed(0);

SQL>create table t1
    pctfree 99
    pctused 1
    as
    with generator as (
      select --+ materialize
        rownum id
      from all_objects
      where rownum <=3000
     )
    select /*+ ordered use_nl(v2) */
      rownum id,
      trunc(100*dbms_random.normal) val,
      rpad('x', 100) padding
    from
       generator v1,
       generator v2
    where rownum <=10000;

2、统计分析

SQL>begin
       dbms_stats.gather_table_stats(
          user,
          't1',
          cascade =>true,
          estimate_percent => null,
          method_opt => 'for all columns size 1'
          );
      end;
      /
3、在参数文件中不设置db_file_multiblock_read_count, 跟踪trace文件

SQL>alter system reset db_file_multiblock_read_count scope=spfile sid='*';
SQL>重启数据库

a)查看隐含参数

SQL>select a.ksppinm, b.ksppstvl, b.ksppstdf
           from x$ksppi a, x$ksppsv b
           where a.indx = b.indx
          and a.ksppinm like '%db_file%'
 输出结果:
db_file_multiblock_read_count=10;
_db_file_exec_read_count=10;
_db_file_optimizer_read_count=8;

b)使用10053和10046进行跟踪

SQL>alter session set events '10053 trace name context forever, level 2';
SQL>alter session set events '10046 trace name context forever, level 12';
SQL>select max(val) from t1;
SQL>alter session set events '10046 trace name context off'
SQL>alter session set events '10053 trace name context off';

输出结果:

*****************************
SYSTEM STATISTICS INFORMATION
*****************************
  Using NOWORKLOAD Stats
  CPUSPEED: 792 millions instruction/sec
  IOTFRSPEED: 4096 bytes per millisecond (default is 4096)
  IOSEEKTIM: 10 milliseconds (default is 10)
***************************************
BASE STATISTICAL INFORMATION
***********************
Table Stats::
  Table: T1  Alias: T1
    #Rows: 10000  #Blks:  10000  AvgRowLen:  108.00 
***************************************
SINGLE TABLE ACCESS PATH
  Table: T1  Alias: T1
    Card: Original: 10000  Rounded: 10000  Computed: 10000.00  Non Adjusted: 10000.00
  Access Path: TableScan
    Cost:  2717.67  Resp: 2717.67  Degree: 0
      Cost_io: 2710.00  Cost_cpu: 72914400
      Resp_io: 2710.00  Resp_cpu: 72914400
  Best:: AccessPath: TableScan
         Cost: 2717.67  Degree: 1  Resp: 2717.67  Card: 10000.00  Bytes: 0
 ......................
'db file scattered read' ela= 47 file#=8 block#=42743 blocks=10 obj#=200578 tim=17446052034238
........................

c)分析 跟踪文件

优化器进行成本计算时候,使用_db_file_optimizer_read_count=8

cost_io=ceiling(#MRDs * MREADTIM/SREADTIM) +1
#MRDs=#Blks/mbrc=10000/8=1250
MREADTIM=IOSEEKTIM + mbrc*db_block_size/IOTFRSPEED=10+8*8/4=26
SREADTIM=IOSEEKTIM + db_block_size/IOTFRSPEED=10+8/4=12

==> cost_io=ceiling(1250*26/12+1)=2710
 
而在实际进行多数据块读的时候,db_file_multiblock_read_count =_db_file_ exec_ read_count=10;

'db file scattered read' ela= 47 file#=8 block#=42743 blocks=10 obj#=200578 tim=17446052034238

4、参数文件设置db_file_multiblock_read_count=4

SQL>alter system set db_file_multiblock_read_count=4 scope=spfile;
SQL>重启数据库

查看隐含参数
SQL>select a.ksppinm, b.ksppstvl, b.ksppstdf
           from x$ksppi a, x$ksppsv b
           where a.indx = b.indx
          and a.ksppinm like '%db_file%'
 输出结果:
db_file_multiblock_read_count=4;
_db_file_exec_read_count=4;
_db_file_optimizer_read_count=4;

一旦设置该参数,将发现其值将变成相等

三、小结

      首先,在10.2版本以上不建议参数文件设置db_file_multiblock_read_count值,其次, 经常在论坛中看到别人讨论optimizer_index_cost_adj的设置问题,以降低索引成本计算值,从而提高优化器选择索引的几率,10.2建议不使用该参数值,我们完全可以设置_db_file_optimizer_read_count为较小值,设置_db_file_exec_ read_count较大值,执行计划将能会优先考虑采用索引,但如果优化器选择全表扫描,也能最大提高IO性能。 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

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

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

注册时间:2008-12-18

  • 博文量
    159
  • 访问量
    559686