ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【调优】CBO基础(一)

【调优】CBO基础(一)

原创 Linux操作系统 作者:yellowlee 时间:2011-12-27 19:06:19 0 删除 编辑

 

什么是代价?

 

很多时候我们对CBO的的cost不甚理解,往往在看到执行计划的时候感到迷惑,比如一个hash join的查询的cost值在执行计划中显示有几百万或者更多,而同样的查询使用nest loop的则只有几十,但是hash join在几秒钟就可以完成,而nest loop则要数小时。

 

答案很简单:cost值表现的是优化器对于执行语句的最佳估算,那么这个估算值的真实性怎么来评判呢?有句经典的理论:garbage in ,garbage out.

 

CBO也是人开发的东西,那么就可以能有错误,以下6点是主要的原因:

1.一些不恰当的假定被用在了开销模式中

2.数据分布的相关可用统计信息是错误的或者不准确的

3.数据分布的统计信息不可用

4.硬件的性能oracle并不清楚

5.当前的工作负载不知道

6.代码有问题

 

通常我们认为ORACLECBO的模型如下(点击看大图):

 

 

 

CBO的开销模式:

8i是基于IO的开销模式

9i是基于CPU的开销模式

10gIOCPU兼顾的开销模式

 

10g开始提供离线优化,利用这个特性可以生成和存储一些关键的统计信息到profile中,并用来帮助现在优化器处理相关的数据分布问题。9i10g在对象级别收集缓存信息,并在后续使用,10g有几个隐含参数来支持这个特性。

 

9i10g收集运行时信息,放在两个视图里面:

V$sql_plan_statistics

V$sql_plan_statistics_all

如果当前的实际统计信息与此差别很大的话,优化器将可能重新优化查询。

相关关键信息:

select a.HASH_VALUE,a.sql_id,a.OPERATION,a.OPTIONS,a.OPTIMIZER,

       a.OBJECT_TYPE,a.ID,a.DEPTH,a.COST,a.CARDINALITY,a.BYTES,

       a.CPU_COST,a.IO_COST,a.ACCESS_PREDICATES,a.EXECUTIONS

from v$sql_plan_statistics_all a ;

 

前面提到的cost,我们认为等同于时间,看看cpu开销模式的cost计算算法:

Cost = ( #srds * sreadtim +

                     #mrds * mreadtim +

                     #cpucycles / cpuspeed

)/ sreadtim

 

其中:

#srds   单块读数量

#mrds   多块读数量

Sreadtim   单块读时间

Mreadtim        多块读时间

Cpuspeed         cpu每秒的周期数

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16179598/viewspace-714023/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-12-27

  • 博文量
    316
  • 访问量
    655121