為什麼全表掃描成本(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-消費稅稅率)