所以这就是CBO的好处呀。
当数据库记录很少的时候,CBO会发现采用full-table scan要比index-scan更好。
应该说,并不是一定动用索引就好。
CBO的计算往往和索引的cluster ratio,索引页的level数,数据块的cluster ratio等等有关,理论上动用索引每一级会增加一个logic read IO。因此当数据量很小的时候,FULL-TABLE SCAN缺是一个不错的选择。
当数据库记录很少的时候,CBO会发现采用full-table scan要比index-scan更好。
应该说,并不是一定动用索引就好。
CBO的计算往往和索引的cluster ratio,索引页的level数,数据块的cluster ratio等等有关,理论上动用索引每一级会增加一个logic read IO。因此当数据量很小的时候,FULL-TABLE SCAN缺是一个不错的选择。
mk.status is null 这句不会使用索引 -- 这句话很有道理,我去改改但:f表 为什么是全表扫描呢?
and f.postnr = p.postnr_c(+) f全表扫描可能与(+)有关系.具体没测试过. 觉得优化器在工作的时候有些奇怪(没有完全搞明白). 而且看优化器工作的吧,有时候一个表只有几百条记录,如果你建了一个索引,测试计划中显示也使用了索引的...
或者like 后面的%在前面的话,索引都将不起作用
and f.postnr = p.postnr_c(+)
可我觉得出现这样的情况应该是fp 和 p 这两个表的所有数据都必须访问啊而且,同样这个语句,同样的索引,在两台server运行时,其中一台速度比较快,而另一台就慢得不行,我查了一下执行计划,发现不一样,第一台就没有对f进行全表扫描,第二台就对f进行全表扫描,我觉得很奇怪。
另外,你还可以在SQL语句里加上强制的提示符/*+ RULE*/ ,你会发现执行计划会一样,但是基于规则的优化方法并不推荐使用。
不好意思,我不会对表进行统计分析,能指点一下吗?谢谢!
SQL> call dbms_stats.gather_table_stats('ownername','tablename');