CREATE TABLE TEST(
  A       VARCHAR2(18 BYTE),
  B     VARCHAR2(18 BYTE)
  )
CREATE UNIQUE INDEX PK_TEST ON TEST
(A,B);
ALTER TABLE TEST ADD (
  CONSTRAINT PK_TEST PRIMARY KEY
 (A, B);
每次插入数据a列值都是相同的,数据很大,当前系统的优化是all_rowsdelete test where a='aaa' 执行计划是全表扫描delete /*+rule*/test where a='aaa'   执行计划 是 利用了a 这个非唯一性范围索引
请问为什么上面基于开销的优化方式没有利用索引

解决方案 »

  1.   

    因为“每次插入数据a列值都是相同的”,然后“delete test where a='aaa' ”实际上等同于delete全表了,这时如是CBO,这时当然只做一次全表扫描最快。
    如果用上了索引,那先要扫描索引,再根据rowid去定位一行,这样反而开销大了。
      

  2.   

    像这种情况,在低基数的列上建B树索引意义不大。位图索引倒是可以,但你常做DML,就又不合适了。
      

  3.   

    每次插入数据a列值都是相同的 
    是说第一次插入 100条 其中a都是 ‘abc’ b的值都不一样 
    第二次当然就不是 ‘abc’ 了
      

  4.   


    两个可能的原因1. 可能你的表和索引都没有分析吧. 分析一下看看.analyze table test estimate statistics for table for all indexes for all indexed columns;2. 你表里只有很少的记录(比如一万笔以下), 这种情况下, 全表扫描的成本比你索引扫描的成本还低, 所以CBO选择了全表扫描.