为什么全表扫描成本(COST)公式里面要除以sreadtim

全表扫描的成本计算公式 例如以下:

Cost = (
       #SRds * sreadtim +
       #MRds * mreadtim +
       CPUCycles / cpuspeed
       ) / sreadtim

全表扫描的时候。单块读次数=0,#SRds表示单块读次数。

全表扫描的成本里面,CPU消耗事实上很少,能够忽略不计,所以全表扫描的公式能够改写为:


Cost = #MRds * mreadtim  / sreadtim


#MRds 表示多块读io次数

mreadtim 表示一次多块读耗费时间

sreadtim 表示一次单块读耗费时间


全表扫描的COST意思事实上就是 多块读io次数 * 多块读时间 / 单块读时间


那么为什么 全表扫描成本公式里面要除以 sreadtim呢? 我们来看一下 索引扫描的成本计算公式:


cost =  
 blevel +  
 celiling(leaf_blocks *effective index selectivity) +  
 celiling(clustering_factor * effective table selectivity)  


blevel 是 扫描索引 的 root到branch ---单块读


celiling(leaf_blocks *effective index selectivity) 是扫描的 也在块的个数  ---单块读

ceiling(clustering_factor*effective table selectivity) 是 通过索引的rowid回表的次数 ---单块读


那么 索引扫描的成本公式的本质含义 事实上就是 单块读的 io次数


对于单表訪问(什么是单表訪问? 就是仅仅select一个表)。要么走全表扫描,要么走索引扫描,当然了还能够走物化视图(这个不考虑)

ORACLE 到底是走全表扫描还是走索引扫描呢? 它是计算全表扫描的COST。计算索引扫描的COST 哪个COST消耗少就走哪个。

问题来了,为啥ORACLE计算COST能准确的推断走哪个是最优的呢? 如今我们来比較一下 全表扫描的 COST 与 索引扫描的COST


全表扫描COST   多块读io次数 * 多块读时间 / 单块读时间

索引扫描COST   单块读io次数


那么如今 我们都对 全表扫描 COST , 都对 索引扫描 COST 乘以一个 单块读时间

 

全表扫描COST* 单块读时间  =  多块读io次数*多块读时间  = 总的耗费时间

索引扫描COST* 单块读时间  =  单块读io次数*单块读时间  = 总的耗费时间


说白了,就是比較全表扫描与索引扫描谁 总的耗费的时间最少,就选谁。


到这里你应该看懂了吧。

不得不佩服ORACLE 设计 人员的头脑。真是牛逼。







转载于:https://www.cnblogs.com/ljbguanli/p/6950100.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值