oracle中的CBO是一个智能化的程序,他会根据表内数据或者索引的不同,而执行不同的解释计划,在有时候他会很好。
比如说:如果一个表有1000万条记录,而字段A中=1的数据有500万条,字段A上面有一个普通索引,当我们做下面查询的时候:
select * from table where fielda=1;
oracle就会选择全表扫描,而不是通过索引扫描。
但是有时候oracle的CBO也会出现问题,他会不按照我们的安排来选择一个错误的执行计划。通过大量的对比我发现,oracle的CBO选择执行计划和下面几个因素是相关的:
1.索引的使用
通常出现CBO错误的表都带有索引
2.oracle的统计信息不全
该表从来没有执行过统计信息收集程序,oracle自动的统计信息收集程序是在每日的晚上10点定时执行,如果该表的数据是新灌入的,那么很有可能没有执行过oracle的统计信息收集程序
3.数据量很大的情况
一般数据量很大的情况执行我们会选择hash join,而如果字段有索引,oracle经常会选择nested loop。
综上所述,我认为让oracle的CBO更稳定的方法就是给oracle提供更好的统计信息。这样会让oracle的CBO稳定性提高很多。
如何给oracle提供统计信息,我会用其他文章说明。
使oracle统计信息生效的方法,我也会用其他文章说明。
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/41451/viewspace-1021970/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/41451/viewspace-1021970/