Oracle 基于成本的优化器 CBO公式汇总
作者:奶妈来了 | 分类: 大话技术 | 标签: | 日期:2009-03-21
| 操作 | Cost公式 | Card公式 |
| 全表扫描 | blocks / db_multi_block_read | num_rows * table selective |
| 索引范围扫描 | blevel + leaf_blocks * index selective | index.num_rows * index selective |
| 通过索引rowid访问表 | clustering_factor * table selective | table.num_rows * table selective |
| 索引全扫描 | leaf_blocks / db_multi_block_read | index.num_rows * index selective |
| 嵌套循环连接 | outer card * inner cost | Join Selectivity = ((num_rows(t1) - num_nulls(t1.c1)) / num_rows(t1)) * ((num_rows(t2) - num_nulls(t2.c2)) / num_rows(t2)) / greater(num_distinct(t1.c1), num_distinct(t2.c2)) Join Cardinality = Join Selectivity * filtered cardinality(t1) * filtered cardinality(t2) |
| 哈希连接 | cost of access t1 + cost of access t2 | |
| 排序归并连接 | cost of access t1 + cost of order t1 + cost of access t2 + cost of order t2 |
说明:
1. Card公式是指当前操作的输出记录数.
2. 这里把扫描索引和通过索引访问表的公式分开了.
3. 纵观以上所有Cost公式, 可以发现只有嵌套循环连接的公式中用到了card, 也就是这个地方,
导致在整个CBO当中, 对Card的运算显得很重要, 多表连接的执行计划错误, 很多时候就是因为某个表的card计算错误.
4. 表连接的card计算很复杂, 有时候也是有用的, 比如对视图的优化, 有时候hint什么的都用不上, 但是只要统计信息正确,
保证表连接的card能计算正确, CBO是可以自动打破视图, 走上正确的执行计划的.
有5人发表了评论 ↓发表评论↓



b( ̄▽ ̄)d
niubro @ March 21, 2009 |
ok!(⊙ˍ⊙)
luolongjiu @ March 21, 2009 |
HASH连接如果是one pass或者mutil pass的话,cost 计算有很大变化,除了获取两个结果集需要的COST,还有将构建表hash分区,探测表hash分区写入temp并读入内存所产生的IO COST计算,这个成本算出来比前面的结果要大很多
八神 @ March 22, 2009 |
这个公式怎么得出来的,官方文档上的?你们做实验做出来的,怎么能够发表结论性的东西又不写引用处或实验步骤呢?
Alex @ April 22, 2009 |
对cbo相关算法感兴趣的同学,,可以参考下面这个网站的几篇papers.
http://www.centrexcc.com/papers.html
或者自己找本Jonathan Lewis的cbo的书好好的对照学习/练习..
jametong @ November 23, 2009 |