基于代价的优化器(cbo)在进行全表扫描时偶尔会作出一些错误的选择,这种情况尤其发生在oracle7和oracle8之中。有几种情况会导致这个问题,分别如下所示:最高使用标记(high water mark)太高:当要在一个表中进行大量的删除时,最高使用标记可能会远远高于实际用到的数据块(block)数量。因此,如果依赖于最高使用标记,cbo常常会错误的调用全表扫描。
错误的优化模式:如果optimizer_mode被设置为all_rows或者choose,那么sql优化器会更乐于使用全表扫描。如果想进行快速的oltp优化,必须首先确认已经将optimizer_mode设置成first_rows。
贫乏的统计:如果表已经显著的增长,并且没有被重新分析以更新统计数据,那么也许会错误的进行全表扫描,因为cbo认为表长还是像未增长之前那么小。
偏斜的索引:如果一个查询中的候选索引存在偏斜值,那么cbo也许会错误的选择全表扫描。例如,考虑一个查找所有满足条件region=southern的记录的查询。在region栏中已经有了一个索引,但是只有1%的条目是southern region的。在缺少列的柱状图的情况下,cbo不知道southern region有更高的命中率,所以它会选择全表扫描。
新闻热点
疑难解答