日期:2013-03-14  浏览次数:20453 次

当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的调整是一个关键的方面。