oracle10g以后主要是使用cbo,既然是通过成本计算来决定查询计划,意味着oracle会选择成本最低的查询计划来执行。
在这种条件下,还需要人为去调优吗?不是已经最优了吗?请高手解释一下什么情况下会人为去优化

解决方案 »

  1.   

    http://www.wangchao.net.cn/bbsdetail_1491002.html
      

  2.   

    cbo 并不是万能的 环境不一样出来的执行计划也不一样,比如 对于大表的概念 ,如果2个都是大表,oracle 怎么区分那个是小表,那个是大表呢?cbo 只会根据消耗来判断大小,在不同的数据级别上 ,得到的效果不一定准确,需要人工介入。除非你的环境和oracle cbo的测试环境一样。
      

  3.   


    优化是一个体系上的问题,所以可以从很多方面进行优化,我们最常做的就是sql的优化,这里就涉及到了cbo,有些也是cbo做不了的,比如你错建或者漏建了index,或者index已经失效了,这些都是我们需要根据执行计划来找到原理,并且加以优化的。不过有时执行路径也会有个极限的,换句话说,也就是现在的执行路径已经最优了,怎么还怎么慢呀。这时我们可能要通过其他的方式来调整了,比如IO,等待事件,平行,等这些方面来进行优化了,对于优化来说,没有最好,只有更好。
      

  4.   


    这里个人理解 如果所统计信息不够准确的话,有些容易造成误导,其实对于10g来说,是自动对系统进行采集和统计的,相当于我们在10g之前版本里通过执行dbms_stats.gather_table_stat和dbms_stats.gather_schema_stats一样的,不过不同的就是,默认10g是一个小时做一次的,而我们以前是手工做的,既然是这样的,所以对于一个运行了1天或者更长时间的库来说,虽然最多有一个小时的时效差异,在多时间上的采样的基础上,这1个小时的误差,也不会给各种成本计算的高低差异带来质上的偏差,所以我觉得这里既使由于时效性,这个统计结果不是实时的,但是对各成本之间比较后的衡量结果是没有多大差异的,而且采样时间越久,这个就差异就愈小,这也是10g里提出很多的自动管理的基础所在。当然排开一些极端case。