為什麼全表掃描成本(COST)公式裡面要除以sreadtim,costsreadtim

來源:互聯網
上載者:User

為什麼全表掃描成本(COST)公式裡面要除以sreadtim,costsreadtim

全表掃描的成本計算公式 如下:

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 設計 人員的頭腦,真是牛逼。








為何機會成本公式要除以2?

機會成本=C/2*K
C是現金持有量,這些持有的現金都是要不斷流出的,當流出金額至0時,需要再次獲得C的現金持有量。C→0,C→0。。。周而復始,所以平均現金持有量是C/2
 
消費稅組價公式:(成本+利潤)÷(1-消費稅比例稅率) 這個公式是什?為何要除以1-比例稅率

推導過程如下:
計稅價格=成本+利潤+消費稅額
消費稅額=計稅價格*消費稅稅率
合并兩個公式:
計稅價格=成本+利潤+計稅價格*消費稅稅率
那麼:計稅價格-計稅價格*消費稅稅率=成本+利潤
計稅價格*(1-消費稅稅率)=成本+利潤
計稅價格=(成本+利潤)÷(1-消費稅稅率)
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.