oracle中的cbo,Oracle CBO中如何计算调整的MBRC

【IT168技术文档】在CBO的IO模式中,全表扫描的IO代价不是直接由MBRC(db_file_multiblock_read_count)计算来的,而是由一个相应的调整的值(ADJMBRC)计算的:

IO = 1+CEIL(TABBLKS/ADJMBRC)

Jonathan Lewis曾经讨论过ADJMBRC是由MBRC和数据块大小决定的,以8k数据块大小为例,相应的ADJMBRC是

SQL代码

MBRC ADJMBRC------------ --------------86.591610.403216.416425.90

可以看到,ADJMBRC是一些ROUND过的值,且看起来似乎无规律。我们这里做个数字游戏,看看这些数字直接是否有没有规律。

由之前的公式,可知ADJMBRC计算如下:

ADJMBRC ≈ TABBLKS/(IO - 1)

我们通过测试,调整TABBLKS,可以发现ADJMBRC会逐渐接近某个数字。以MBRC=16为例,其ADJMBRC接近为6.588755338...,同样可得到其他MBRC的ADJMBRC为

SQL代码

MBRC ADJMBRC------------ --------------86.5887553381610.397796763216.40889246425.89507721

虽然精度提高了,但是规律还是不可寻。我们尝试计算ADJMBRC/MBRC看看会有什么结果:

SQL代码

MBRC ADJMBRC ADJMBRC/MBRC------------ -------------- -------------86.5887553380.8235944171610.397796760.6498622983216.40889240.5127778886425.895077210.404610581

嗯,还是看不到规律。不过注意到,我们这的MBRC直接是倍数关系,那么再试试将ADJMBRC/MBRC的结果前后相除会有什么结果:

SQL代码

MBRC ADJMBRC ADJMBRC/MBRC (ADJMBRC/MBRC[n*2])/(ADJMBRC/MBRC[n])------------ -------------- - -------------------------------------86.5887553380.8235944171.267336821610.397796760.6498622981.267336823216.40889240.5127778881.267336826425.895077210.404610581

哈,这下找到了。由上面的推导过程,也就不难得出ADJMBRC的公式了:

ADJMBRC = 1.6764459346/POWER(1.26733682,LOG(MBRC,2))*MBRC

再考虑BLKSIZ因素,上述公式就可以调整为:

ADJMBRC = 1.6764459346/POWER(1.26733682,LOG(8192/BLKSIZ*MBRC,2))*8192/BLKSIZ*MBRC

对1.6764459346取反,可知其为(1/0.5965)。但是我仍然没有看出1.26733682是如何来的。上述公式调整为:

ADJMBRC = 1/0.5965/POWER(1.26733682,LOG(8192/BLKSIZ*MBRC,2))*8192/BLKSIZ*MBRC

有了上述公式,我们就不难通过SQL来估算表(或分区)的Full Table Scan的IO代价了:

SQL代码

HELLODBA.COM>selectp.value mbrc,21/0.5965/POWER(1.26733682,LOG(2,8192/sp.block_size*p.value))*8192/sp.block_size*p.value adjmbrc,3s.blocks,41+ceil(s.blocks/(1/0.5965/POWER(1.26733682,LOG(2,8192/sp.block_size*p.value))*8192/sp.block_size*p.value)) IOCOST5fromdba_segments s, dba_tablespaces sp, all_parameters p6wheres.owner='DEMO'ands.segment_name='T_TEST1'7ands.tablespace_name=sp.tablespace_name8andp.name='db_file_multiblock_read_count';

MBRC ADJMBRC BLOCKS IOCOST------ ----------- ---------- ----------1610.397796868067HELLODBA.COM>setautot traceexpHELLODBA.COM>select/*+no_cpu_costing*/*fromdemo.t_test1;

ExecutionPlan----------------------------------------------------------Planhash value:1883417357-------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost|-------------------------------------------------------------|0|SELECTSTATEMENT||47582|4600K|67||1|TABLEACCESSFULL|T_TEST1|47582|4600K|67|-------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值