2008年12月10日星期三

ORACLE数据库的成本是什么

在应用ORACLE数据库的过程中,我们经常需要查看执行计划。执行计划里最重要的两个指标就是基数和成本。很多人都对成本的含义不清楚,因此有必要弄清楚其意义到底是什么。

根据ORACLE database performance tuning guide,
cost=(
#SRds*sreadtim+
#MRds*mreadtim+
#CPUCycles/cpuspeed
)
/sreadtim

where
#SRds number of single block reads(单块读取数量)
#MRds number of multi block reads(多块读取数量)
#CPUCycles number of cpu cycles(CPU转数)

sreadtim single block read time(单块读取时间)
mreadtim multi block read time(多块读取时间)
cpuspeed cpu cycles per seconde(CPU每秒钟转数)

实际上,成本就是,操作花费在单块读上的总时间,加上花费在多快读上的总时间,再加上CPU处理总时间,除以一个单块读需要花费的总时间。

有人说COST仅仅是个相对的数值,只是在比较不同操作的成本时才有用,当然是不正确的,上式表明COST是尤其自己的意义的(跟时间相关)。

其实ORACLE选取这样一个奇怪的单位来衡量成本的大小,一点也不让人吃惊。当然也有人说,ORACLE使用这个公式只是为了保持跟以前版本的延续。但是很显然这个说法是错误的。为什么ORACLE在第一次出现CBO时会选择这个古怪的单位来表示成本呢,这个上述说法显然无法解释这个问题。我以为,使用这个单位的原因主要是它可以消除由于硬件带来的差异。比如一台IBM最高端的服务器和随便一台笔记本电脑的运行速度明显不一样。这就会造成运行于这两台机器上的ORACLE数据库在执行同样的操作的时候,消耗的时间不同。而通过以上的计算,选择那个古怪的单位作为成本的单位,就可以消除硬件带来的差异(当然软件环境一致的情况下才能在不通的机器上得到同样的成本)。

有问题欢迎与我讨论。

没有评论: