ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【调优】CBO基础(六)

【调优】CBO基础(六)

原创 Linux操作系统 作者:yellowlee 时间:2011-12-27 19:14:09 0 删除 编辑

简单btree访问

这部分看看单表的btree访问的cost

 

cost =

blevel +

ceiling(leaf_blocks * effective index selectivity )+

ceiling(clustering_factor * effective table selectivity)

 

 

做个测试验证一下:

 

 

create table t_test_tb12 as select * from dba_objects a where a.OBJECT_ID is not null ;

create index ind_test_tb12_1 on t_test_tb12(object_id);

 

insert into t_test_tb12 select * from t_test_tb12 a ;

 

 

begin

dbms_stats.gather_table_stats(user,'t_test_tb12');

end;

/

 

这里的

effective index selectivity

effective table selectivity

可以由下面公式计算出:

1/DISTINCT_KEYS

AVG_DATA_BLOCKS_PER_KEY /NUM_ROWS

 

 

SELECT A.BLEVEL, --2

       A.LEAF_BLOCKS,--844

       A.DISTINCT_KEYS, --91550

       A.AVG_LEAF_BLOCKS_PER_KEY,--1

       A.AVG_DATA_BLOCKS_PER_KEY,--4

       A.CLUSTERING_FACTOR,--366200

       A.NUM_ROWS--366200

  FROM DBA_INDEXES A

 WHERE A.INDEX_NAME = UPPER('ind_test_tb12_1');

 

select * from t_test_tb12 a where a.object_id  = 15;

测试多次插入值,收集统计信息后的查询计划,查看cost值可以看到,基本可以符合前面的公式:

 

select  1 + ceil(190*1/91548) +ceil(1896*1/91548) from dual ;

select  2 + ceil(844*4/91550) +ceil(366200*4/366200) from dual ;

select  2 + ceil(1714*8/91550) +ceil(732400*8/732400) from dual ;

select  2 + ceil(3349*16/91550) +ceil(1464800*16/1464800) from dual ;

 

 

这个公式也不难理解,基本的原理有几点:

1,  btree的基本结构,root/branch block ,leaf block的特点

2,  通过btree访问行的原理

 

 

上面的例子是=号,><<>的情况类似,也可以推算出来。

 

 

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

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

注册时间:2008-12-27

  • 博文量
    316
  • 访问量
    654963