当Oracle每一次新版本的发布,这一数据库就会变得更加的受关注,尤其是它的外部环境。Oracle在Oracle服务器上设置了很多基于CPU个数的重要的初始化参数,并且Oracle现在已经更加地意识到CPU运行循环周期和I/O操作的使用代价。
基于成本的SQL优化器(CBO)已经被提高到考虑外部的影响,尤其是当为一个SQL查询处理最佳执行的时候。因为数据库并非运行在一个不受其他因素影响的环境中,CBO将会成为影响每一次SQL操作的外部磁盘I/O代价和CPU运行周期代价的因素。这一重要的功能使得CBO成为全球多数成熟软件产品中的其中一个。CBO的工作就是为任何SQL操作选择一个最佳的执行计划。
根据Oracle文档,对于I/O和CPU的使用代价评价如下:
使用代价 =
(#SRds * sreadtim + #MRds * mreadtim + #CPUCycles
-------------------------------------------------
cpuspeed )
-------------------------------------------------
sreadtim
这里:
#SRDs ? 单块读入的数目
#MRDs ? 多块读入的数目
#CPUCycles ? CPU运行周期的数目
sreadtim
- 单块读入的时间
mreadtim ? 多块读入的时间
cpuspeed
-
每一秒的CPU运行次数
请注意外部使用代价受到磁盘读定的估计使用代价以及与每一次内部操作相联系的估计CPU代价的影响。Oracle保存有关SQL处理的许多成分代价的详细信息,并使用这些平均的代价来影响基于成本的SQL优化器的选择。以下是一些范例:
杂乱信号连接的代价──Oracle知道一个杂乱连接所消耗的RAM内存的平均数量。
分类──Oracle为了执行分类和集中操作而保持跟踪RAM。
列表扫描代价──Oracle保存关于执行一个多块读入需要时间的信息。
索引块访问代价──Oraclet知道引出一个单一的块所需要的平均时间。
请注意这些使用代价的评价依据是不同的,这主要取决于你对Oracle优化器的选择。如果你具有一个带有first_rows优化器模式的OLTP系统,CBO就能够更快地返回行操作。另一方面,如果你使用的是数据仓库的first_rows优化器模式,CBO将会被这些外部因素严重影响,因为first_rows模式被设计以减少资源消耗
为了能够完整地理解Oracle的外部使用代价,让我们深入查阅这些新的外部影响和Oracle CBO如何使用外部使用代价。
CPU代价
现在CBO已经能够估计每一操作需要的机器运行周期的数量级,并影响执行计划计算的代价。与Oracle查询有关的CPU使用代价取决于当前的服务器载入情况。CPU代价通常并不是很重要,除非是整个Oracle程序使用过多的CPU资源。
IO代价
CBO可以估计每一操作的物理块读入的数量级。I/O代价与物理数据块读入成正比。然而,CBO不具备缓冲目录的优先权利,也不能区别一个逻辑读入和一个物理读入。因为这些缺点,CBO无法识别数据块是否已经读入RAM数据缓冲器。
并非完全的完美
注意到这些使用代价也是读入数量的功能,并与读入次数有关,也注意到外部代价并没有考虑到位于RAM数据缓冲器的数据块的数量,但新的CBO发布版本应该考虑到这一因素。
这里我们可以看到Oracle都使用了评测执行计划的CPU和I/O代价评估。相比于我们处理一些类似查询而言,这一评估会变得更加复杂,因为类似查询可以被许多并发的程序处理。
在我文章的下一栏中,我将会讲到CBO如何被统计数量所影响。为了能够做出最好的执行计划,CBO必须充分使用与查询有关的所有数据项目信息,因为你必须控制如何分配统计数量,这对CBO的调整是一个关键的方面。