Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103069013
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-05-24 19:05:33

  来源:


基于代价的优化器(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有更高的率,所以它会选择全表扫描。
阅读(873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~