現在我建了一個索引,
如果語句where 後面跟一個特定值,那麼就能熱執行索引;
比如這樣寫就能有索引的:
SELECT A.RKD16 RKRQ,
           A.BM01 BM,
           A.WLDW01 WLDW,
           A.RKD19 TJXYH,
           A.RKD04 HZFS,
           B.SPXX01 SPXX,
           SUM(B.RKDI05) RKSL,
           sum(B.RKDI07) JHJE
      FROM RKDITEM B, RKD A
     WHERE 
        A.RKD16 >= to_date('2004-11-04','yyyy-mm-dd')
       AND A.RKD16 <=to_date('2004-11-04','yyyy-mm-dd')
       AND B.RKD01 = A.RKD01
     group by A.RKD16, A.BM01, A.WLDW01, A.RKD19, A.RKD04, B.SPXX01;但是如果後面跟的是變量,如下面那樣:SELECT A.RKD16 RKRQ,
           A.BM01 BM,
           A.WLDW01 WLDW,
           A.RKD19 TJXYH,
           A.RKD04 HZFS,
           B.SPXX01 SPXX,
           SUM(B.RKDI05) RKSL,
           sum(B.RKDI07) JHJE
      FROM RKDITEM B, RKD A
     WHERE 
        A.RKD16 >= :mm
       AND A.RKD16 <=:mm
       AND B.RKD01 = A.RKD01
     group by A.RKD16, A.BM01, A.WLDW01, A.RKD19, A.RKD04, B.SPXX01就進行了全盤掃描,為什麼會有這種現角象,請高手告訴我個解決辦法啊。。不勝感激。。

解决方案 »

  1.   

    什麼是cbo?能不能說詳細點啊?哥們
      

  2.   

    cbo是基于成本的优化。oracle在执行查询之前需要建立查询优化树,并确定查询执行的检索步骤和策略。
    针对第一种情况,在建立查询优化树的时侯,oracle知道你要对字段检索,并能计算出给定值检索需要的大约成本;
    而第二种情况下,由于在建立计划树的时侯,oracle并不清楚你要输入的变量值是什么,极端点来说你输入的最小值可能比表中最小的值都要小,而最大值比实际最大值还要大,这时如果使用索引进行检索,反而增加了检索开销。
    由于oracle无法确认你使用索引的方法能否减少开销,所以他宁愿不使用这个索引,而采用全表扫描的方式执行检索。