ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 计算表扫描中执行计划的COST

计算表扫描中执行计划的COST

原创 Linux操作系统 作者:yezhibin 时间:2009-08-28 10:38:38 0 删除 编辑
        以下计算执行计划中表扫描的成本实验是在AIX平台下10.2.0.1进行的:

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、查看实际的IO和CPU成本

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

提取跟踪文件相应数值:
跟踪文件:
    cost_io=2221
    cost_cpu=73954130
    #Blks = 10146
    cost=2228.75

4、10g下noworkload统计信息以及相关参数查询

SQL>select pname, pval1 from sys.aux_stats$
     where sname='SYSSTATS_MAIN';
 
  PNAME                               PVAL1
  ------------------------------ ----------
   CPUSPEEDNW                        795.134
   IOSEEKTIM                              10
   IOTFRSPEED                           4096 

SQL>show parameter DB_FILE_MULTIBLOCK_READ_COUNT;
 DB_FILE_MULTIBLOCK_READ_COUNT=16
该数值匹配到计算公式中mbrc

5、ORACLE10g的成本计算公式

cost = (#SRDs * SREADTIM +
          #MRDs * MREADTIM +
          #CPUCycles/cpuspeed)/SREADTIM
       = #SRDs +                            --因为是表扫描,所以该值为0
         #MRDs * MREADTIM/SREADTIM +        -- IO cost
         #CPUCycles/(cpuspeed * SREADTIM)   -- CPU cost

6、手工计算IO成本,看是否与步骤2中IO成本实际值匹配

手工计算:
      cost_io= #MRDs * MREADTIM/SREADTIM,所得数值取最大整数,另外隐含参数_table_scan_cost_plus_one=true,所以cost_io需要添加1。所以10g实际公式为:
    cost_io=ceiling(#MRDs * MREADTIM/SREADTIM) +1
 
其中:
    #MRDs=#Blks/mbrc=10146/16
    MREADTIM=IOSEEKTIM + mbrc*db_block_size/IOTFRSPEED
                       = 10+ 16*8k/4k=42
   SREADTIM=IOSEEKTIM + db_block_size/IOTFRSPEED
                       =10+8k/4k=12

   cost_io=ceiling(10146/16*42/12)+1=ceiling(2219.4375)+1=2220+1=2221

计算值与步骤2中实际IO成本cost_io=2221一致。

7、手工计算CPU成本

     cpu成本=#CPUCycles/(cpuspeed * SREADTIM)

    其中
         #CPUCycles等于10053跟踪文件中cost_cpu=73954130,
         cpuspeed=795.134MHz=795134Hz
         SREADTIM=12
    所以
       cpu成本=73954130/(795134*12)=7.75

8、总的成本计算值
     cost=cost_io+ cpu成本=2221+7.75=2228.75

以上的计算值与实际所获得的成本值完全一致。

备注:来源于Jonathan Lewis的《CBO基础》第二章节tablescan。
 

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

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

注册时间:2008-12-18

  • 博文量
    159
  • 访问量
    509673